ユーザー評価を格納するテーブルpledgeRating
があります。すべての挿入時に、私は以下のトリガがpledgeTemplate
テーブルにratingsCount
とrating
列を更新するために実行します。完全を期すために更新クエリがトリガーからのものであるかどうかを検出します。
CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeRating_AFTER_INSERT` AFTER INSERT ON `pledgeRating` FOR EACH ROW
BEGIN
UPDATE `pledgeTemplate`
SET `rating` = ((`rating` * `ratingsCount`) + NEW.rating)/(`ratingsCount` + 1),
`ratingsCount` = `ratingsCount` + 1
WHERE `id` = NEW.pledgeTemplateID;
END
私はpledgeTemplate
テーブルに直接ratingsCount
とrating
列を更新からすべてのMySQLユーザーを防止したいです。これらの2つの列をトリガーからのみ更新する必要があります。
CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeTemplate_BEFORE_UPDATE` BEFORE UPDATE ON `pledgeTemplate` FOR EACH ROW
BEGIN
IF (OLD.ratingsCount != NEW.ratingsCount OR OLD.rating != NEW.rating) AND {{Update query is not from the trigger}} THEN
SIGNAL sqlstate '45000' SET message_text = 'Error: Only trigger can modify ratingsCount or rating columns';
END IF;
END
:私は更新クエリを実行しているユーザーを検証するために
pledgeTemplate
テーブルに新しいトリガを作成しましたが、私はその更新がトリガーからかそうでないかを検出する方法を見つけることができないことを実現するために
最初のトリガからフラグを渡すことができるので、2番目のトリガでトリガが検出されたかどうかを検出できますか?私はCURRENT_USER
オブジェクトとUSER()
の機能を調べましたが、これは参考になると思いました。ただし、CURRENT_USER
は常にDEFINER
に設定され、USER()
は常に初期クエリを実行するユーザーを返します。
したがって、pledgeTemplate
テーブルの更新クエリがトリガーまたは「直接」更新から実行されるかどうかを検出する方法はありますか。 Hello_
私は考えていませんが、あなたのユーザのためにそれぞれのテーブルのUPDATEパーミッションを削除することができます – Mihai
それでも、私のユーザは 'pledgeTemplate'テーブルを更新する必要があります。 UPDATE権限を削除すると、すべての更新を停止します。私はちょうどそれらの2つの列がトリガー以外から更新されないように保護したい。 – Guferos