选择PostgreSQL触发器的模式

时间:2012-12-02 10:31:07

标签: postgresql triggers schema

我创建了简单的触发器:

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模式中创建的...为什么?

1 个答案:

答案 0 :(得分:0)

我认为混淆是触发器与触发器的search_path存在的模式,即您调用的函数的模式。

触发器存储在与表相同的模式中。但是,该过程的搜索路径将在创建时根据您当前的search_path设置进​​行处理。因此,如果要在特定模式中调用函数,则可能需要通过模式限定名称进行调用。