2017-04-27 2 views
0

構造的には同じですが時間の経過とともに変化する数多くのデータベースがあります。特定のテーブル(すべてのDBS)のデータは、中央データベース(db_central)の1つの中央テーブル( 'ex_objects')にコピーする必要があります(pkの競合はありません)。私はこの目的のために各DBにトリガーを使用しました。しかし、テーブル構造はほぼ毎日変化しているので、トリガーのクエリのON DUPLICATE KEY部分のフィールドを更新するのは苦労です。そして、誰かがテーブル構造を変更した後にトリガーを修正するのを忘れるかもしれません。だから私は、その特定の部分を動的に構築するための可能な解決策を見つけました。これは実際にスクリプト(PHP)ベースで動作しますが、私はトリガーを完了させることはありません。私はここで紛れているものは見ません。トリガーのON DUPLICATE KEYに動的なフィールド名を持つ変数を使用する方法(MariaDB/MySQL)

BEGIN 
    DECLARE VAL_FIELDS TEXT; 
    SET VAL_FIELDS = (SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_central' AND TABLE_NAME = 'ex_objects'); 
-- SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") INTO VAL_FIELDS FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_central' AND TABLE_NAME = 'ex_objects'; 
-- SELECT @VAL_FIELDS := GROUP_CONCAT(CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") INTO VAL_FIELDS FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_central' AND TABLE_NAME = 'ex_objects'; 

    IF NEW.online = 1 THEN 
     INSERT INTO db_central.ex_objects 
      SELECT * FROM ex_objects WHERE id = NEW.id AND client_id = NEW.client_id AND NEW.online = 1 
      ON DUPLICATE KEY UPDATE VAL_FIELDS; 
    END IF; 
END 

私は; END IF; ENDで何か問題があることをエラーが発生します。つまり、KEY UPDATEの後の変数VAL_FIELDSがまったく認識されないか、少なくとも1つの式(何かがVAL_FIELDS = whateverのようなもの)が必要であることがわかります。しかし、この場合、根本的な問題はまったく解決できません。

SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME,"=v ... FROM INFORMATION_SCHEMA.C ...クエリはうまく動作し、id=values(id), xfield=values(xfield), yfield=values(yfield)と似たような結果になります(ただし、テーブルは実際にはかなり大きいので、数百フィールドあります)。

完全なエラー:SQLエラー(1064):SQL構文にエラーがあります。あなたのMariaDBサーバのバージョンに対応するマニュアルをチェックしてください。 END IF; END 'at line 10

答えて

0

CONCATなど、次にprepareおよびexecuteを使用してSQLを構築する必要があります。 「補間」はありません。

TRIGGERなので、うまくいきません。

ただし、TRIGGERが特定のテーブルに適用されるため、クエリを作成しても構いません。手動で生成されたクエリを取得するには、ほとんどの処理が必要です(SELECT ... I_S ...)。いくつかの列を追加してOLD.colを記入してください。ビオラ、必要な質問があります。

+0

うまくいけば(それを試してみましたが)、トリガーは動的なクエリをサポートしていません。 – antesoles

+0

おっと、私はそれを見落とした - 私の変更を参照してください。 –

関連する問題