4

PHP PDOを使用しているため、1つのクエリに収まる必要があるテーブル行削除ステートメントでユーザーIDをログに記録するMySQLトリガーを作成する必要があります。これは私がこれまでに思いついたものです:

実行する削除アクションとは関係ありませんが、削除クエリでユーザー ID を渡す方法が必要です。

通常、クエリは次のようになります。

DELETE FROM mytable WHERE mytable.RowID = :rowID

ステートメントで複数のクエリを使用できる場合、次のようにします。

SET @userID := :userID;
DELETE FROM mytable WHERE mytable.RowID = :rowID;

このようにして、トリガーイベントが発生する前に変数 @userID が設定され、それを使用できるようになります。ただし、delete ステートメントを 1 つのクエリで絞り込む必要があるため、次のように考えました。

DELETE FROM mytable 
WHERE  CASE
           WHEN @userID := :userID
           THEN mytable.RowID = :rowID
           ELSE mytable.RowID IS NULL
       END

注意: RowID は主キーであるため、null になることはありません。ここで、ユーザー ID を監査テーブルに記録するために削除トリガーを作成する必要がありますが、この場合、削除クエリ自体の前にトリガーが起動されると思います。つまり、@userID 変数は作成されませんか? これは、トリガーに値として渡すという私の考えでした。

解決に近づいたような気がしますが、この問題はブロッカーです。ステートメントに複数のクエリを使用せずにユーザー ID 値をトリガーに渡す方法は? ご意見、ご提案はありますか?

4

1 に答える 1

-1

NEW / OLD mysql トリガー拡張機能を使用できます。参照: http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

サンプルコードは次のとおりです。

drop table `project`;
drop table `projectDEL`;

CREATE TABLE `project` (
  `proj_id` int(11) NOT NULL AUTO_INCREMENT,
  `proj_name` varchar(30) NOT NULL,
  `Proj_Type` varchar(30) NOT NULL,
  PRIMARY KEY (`proj_id`)
);



CREATE TABLE `projectDEL` (
  `proj_id` int(11) NOT NULL AUTO_INCREMENT,
  `proj_name` varchar(30) NOT NULL,
  `Proj_Type` varchar(30) NOT NULL,
  PRIMARY KEY (`proj_id`)
);


INSERT INTO `project` (`proj_id`, `proj_name`, `Proj_Type`) VALUES
(1, 'admin1', 'admin1'),
(2, 'admin2', 'admin2');


delimiter $
CREATE TRIGGER `uProjectDelete` BEFORE DELETE ON project
FOR EACH ROW BEGIN

  INSERT INTO projectDEL SELECT * FROM project WHERE proj_id = OLD.proj_id;

END;$
delimiter ;

DELETE FROM project WHERE proj_id = 1;

SELECT * FROM project;
SELECT * FROM projectDEL;
于 2013-02-01T10:35:23.717 に答える