0

プロシージャを呼び出すときに動的トリガーを作成したいのですが、mysqlサーバーバージョンの構文エラーが発生します。そのクエリを選択して別のクエリエディタで実行すると、実行されます。

DROP TABLE IF EXISTS auditLog;
CREATE TABLE `auditlog` (
  `tableName` VARCHAR(255) DEFAULT NULL,
  `rowPK` INT(11) DEFAULT NULL,
  `fieldName` VARCHAR(255) DEFAULT NULL,
  `old_value` VARCHAR(255) DEFAULT NULL,
  `new_value` VARCHAR(255) DEFAULT NULL,
  `ts` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=ARCHIVE;

CREATE TABLE country(countryname VARCHAR(100);

DROP PROCEDURE IF EXISTS addLogTrigger;
DELIMITER $
/*
call addLogTrigger('country','CountryID','CountryName')

*/
CREATE PROCEDURE addLogTrigger
(IN tableName VARCHAR(255), IN pkField VARCHAR(255),IN column_name VARCHAR(50))
BEGIN


    SET @qry = CONCAT
    (
' 
DROP TRIGGER IF EXISTS  ', tableName, '_AU ; 

CREATE TRIGGER ', tableName, '_AU AFTER UPDATE ON ', tableName, ' 
FOR EACH ROW
              ',' 
                 INSERT INTO auditLog (',
                    'tableName, ',
                    'rowPK, ',
                    'fieldName, ',
                    'old_value, ',
                    'new_value'
                    ') VALUES 
                    ( ''', 
                        tablename, ''', NEW.', 
                        pkField, ', ''', 
                        column_name, ''', OLD.', 
                        column_name, ', NEW.', 
                        column_name, 
                    '); 
                    '
             , '  

             '
        ) ;

        SELECT @qry;
        PREPARE stmt FROM @qry;
            EXECUTE stmt;
         DEALLOCATE PREPARE stmt;

END$
DELIMITER ;
4

1 に答える 1

2

カーティケヤン、

ストアド プロシージャ内にトリガーを作成することはできません。トリガーは、プロシージャ内で許可されていない DDL ステートメントです。

" エラー 1303 (2F003): 別のストアド ルーチン内から TRIGGER を作成できません "

目的を解決するには、次のことができます。

  • 変数内のテーブルから現在の値を取得します。

  • プロシージャ内に更新クエリを記述し、値が更新されているかどうかを「ROW_COUNT()」で確認するだけです。

  • 新しい値と変更された古い値を比較し、change_log テーブルに手動で挿入します。

于 2012-09-27T05:08:30.993 に答える