モジュールのレッスン (3/4)
トリガーの概要
トリガーは、データの挿入、更新、または削除イベントの前後にロジックの一部を自動的に実行する魔法のボックス (センサー) です。\nただし、テーブルに反応するように教える前に、PL/pgSQL で書かれた特別な「トリガー関数」をテーブルに与える必要があります。この関数は、「TRIGGER」と呼ばれる合成形式を返すことで終了する必要があります。
これらの関数は、括弧内の通常の引数を受け入れません。代わりに、センサーが監視しているテーブルからの元の行データまたは受信行データが含まれる魔法の組み込みオブジェクト NEW および OLD を無料で提供します。
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;このプロシージャは、ログへの書き込みという困難な作業を実行します。その後、第 2 ステップで、保護したいテーブルのイベントに永続的に接続されます。
自分で試してみてください
顧客を保護する必要があります: 18 歳未満は禁止 (仮想チェック)、または架空のロジックを超えて、INSERT 時に渡される 'first_name' 文字列が、JS クライアントの書式設定を無視して常に大文字でデータベースに保存されるようにしたいと考えています。\n'force_uppercase_name()' というトリガー関数を作成します。 () 引数は受け入れられません。\nTRIGGER を返します。本文テンプレートを作成します。\nマジック割り当て 'NEW.first_name = UPPER(NEW.first_name);' を使用して、受信オブジェクト全体を強制的に割り当てます。次に、再形成された NEW 変数を RETURN します。
ヒントを表示
関数の作成または置換force_uppercase_name() はトリガーとして $$ BEGIN NEW.first_name = UPPER(NEW.first_name) を返します。新しいものを返します。終わり; $$ 言語 plpgsql;
3 回の試行後に解決策が利用可能になります
攻撃者が製品を法外に低価格にしようとする悪意のあるアップデートをブロックするトリガー関数「protect_price_drops()」を作成します。\n「IF NEW.unit_price < OLD.unit_price THEN」のようなロジックを使用して、すべてをクラッシュさせるネイティブ例外を発生させます。\n致命的な PL/pgSQL 例外は、「RAISE EXCEPTION ''Prezzo non abbassabile!'';」という形式を使用します。
ヒントを表示
BEGIN IF NEW.unit_price < OLD.unit_price THEN RAISE EXCEPTION 'Prezzo non abbassabile!';終了 IF;新しいものを返します。終わり;
3 回の試行後に解決策が利用可能になります