0

簡単なトリガーを作成しました:

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 TRIGGERpublic

4

1 に答える 1

0

混乱は、トリガーが存在するスキーマとトリガーsearch_pathのスキーマ、つまり、呼び出す関数がスキーマであることにあると思います。

トリガーは、テーブルと同じスキーマに格納されます。ただし、プロシージャの検索パスは、現在の設定に基づいて作成時に処理されsearch_pathます。したがって、特定のスキーマで関数を呼び出したい場合は、おそらくスキーマ修飾名で呼び出したいと思うでしょう。

于 2013-04-19T14:23:45.053 に答える