1

MySQL サーバーで動的に生成されたクロス集計ビューの一部のデータを非正規化しようとしています。hereの役立つ回答により、このクロス集計ビューを生成するストアド プロシージャを正常に作成できました。

これは私の手順です:

DELIMITER $$

CREATE PROCEDURE `PartFlow`.`DimMatTab` ()
BEGIN
    SET @cols = (
    SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
            '\nSUM(IF(dimension_id = ',
            dimension_id,
            ', value, NULL)) AS ',
            name
        )
    ) as column_list
    FROM PartFlow.tDimMatMap
    JOIN PartFlow.tDimension
        on tDimension.id_dimension = tDimMatMap.dimension_id
    );

    SET @sql = CONCAT(
        'CREATE OR REPLACE VIEW `PartFlow`.`vDimMatTab` AS '
        'SELECT material_id, ',
        @cols,
        ' FROM tDimMatMap ',
        'GROUP BY material_id;');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
END

次のクエリを含むビューを生成します。

select
`material_id`
,sum(if((`dimension_id` = 2),`value`,NULL)) AS `Width`
,sum(if((`dimension_id` = 3),`value`,NULL)) AS `Height`
,sum(if((`dimension_id` = 5),`value`,NULL)) AS `Thickness`
from `PartFlow`.`tDimMatMap`
group by `material_id`

ビューに常に適切なクロス集計列が含まれるように、tDimMatMap に変更があった場合にビューを更新したいと考えています。このソーステーブルの挿入、更新、または削除でプロシージャをトリガーしようとしました。これが私のトリガーコードです:

create trigger update_view_iMat after insert on tDimMatMap
for each row call DimMatTab();$$

create trigger update_view_uMat after update on tDimMatMap
for each row call DimMatTab();$$

create trigger update_view_dMat after delete on tDimMatMap
for each row call DimMatTab();$$

私の考えでは、これは完璧なセットアップですが、tDimMatMap テーブルを編集しようとすると、「ストアド関数またはトリガーでは動的 SQL は許可されていません」というエラー メッセージが表示されます。これを回避する方法はありますか?間違った角度から問題に取り組んでいますか? クロス集計ビューに、tDimMatMap テーブルにリストされているすべての一意の「dimension_id」の列が常に含まれていることを確認したいだけです。

私は複数のクライアント フロントエンドからこのデータにアクセスしているので、この一元化されたソリューションが正しいと思われます。サーバーの外部で SQL コードを生成するか、ビューを作成せずにデータを取得する手順を実行する必要があると言う人もいると思いますが、クライアント内でこのビューを動的に更新することはできません。クライアント内の手順。最も重要なことは、このビューは特定のアプリケーションで他のビューやテーブルに結合されるため、ビューを作成することは非常に重要なことです。

4

0 に答える 0