Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择PostgreSQL触发器的模式_Postgresql_Triggers_Schema - Fatal编程技术网

选择PostgreSQL触发器的模式

选择PostgreSQL触发器的模式,postgresql,triggers,schema,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

我创建了简单触发器:

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文档中,它是关于触发器的名称编写的:

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();
提供新触发器的名称。这必须与同一表的任何其他触发器的名称不同。名称不能是架构限定的-触发器继承其表的架构。对于约束触发器,这也是使用集合约束修改触发器行为时要使用的名称


所以我希望我的触发器得到schema
beta2
,因为我在
CREATE trigger
请求中使用了它,但事实并非如此,我的触发器是在default
public
schema中创建的……为什么?

我认为触发器存在的schema与触发器的
搜索路径
之间存在混淆,也就是说,您调用的函数的模式是


触发器存储在与表相同的架构中。但是,该过程的搜索路径在创建时根据您当前的
search\u path
设置进行处理。因此,如果您想在特定架构中调用函数,您可能希望通过架构限定名称调用。

您使用的postgresql版本是什么?我的问题是我没有调用过程beta2.emplate_libre(),而是只调用emplate_libre()。现在问题解决了。我想结束这个问题。我同意我们应该结束它。