簡単なトリガーを作成しました:
CREATE OR REPLACE FUNCTION emplacement_libre() RETURNS TRIGGER AS $BODY$
DECLARE
i int;
curseur CURSOR FOR
SELECT COUNT(*) FROM beta2.astres a
INNER JOIN beta2.planetes p ON a.id = p.astre_id
WHERE a.galaxie = NEW.galaxie AND
a.ss = NEW.ss AND
a.position = NEW.position;
BEGIN
OPEN curseur;
LOOP
FETCH curseur INTO i;
IF i>0 THEN
RAISE EXCEPTION 'la planète est déjà occupée';
END IF;
EXIT WHEN NOT FOUND;
END LOOP;
CLOSE curseur;
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
CREATE TRIGGER emplacement_libre
BEFORE INSERT OR UPDATE ON beta2.astres
FOR EACH ROW EXECUTE PROCEDURE emplacement_libre();
PostgreSQL doc では、トリガーの名前について次のように書かれています。
新しいトリガーに付ける名前。これは、同じテーブルの他のトリガーの名前とは異なる必要があります。名前をスキーマ修飾することはできません —トリガーはそのテーブルのスキーマを継承します。制約トリガーの場合、これは、SET CONSTRAINTS を使用してトリガーの動作を変更するときに使用する名前でもあります。
リクエストでスキーマbeta2
を使用しているため、トリガーがスキーマを取得することを期待していましたが、そうではありません。トリガーはデフォルトのスキーマ内に作成されます...なぜですか?CREATE TRIGGER
public