【问题标题】:Choose schema of PostgreSQL trigger选择 PostgreSQL 触发器的模式
【发布时间】:2012-11-20 01:02:30
【问题描述】:

我已经创建了简单的触发器:

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

赋予新触发器的名称。这必须与同一表的任何其他触发器的名称不同。该名称不能是模式限定的 - 触发器继承其表的模式。对于约束触发器,这也是使用 SET CONSTRAINTS 修改触发器行为时使用的名称。

所以我希望我的触发器能够获取架构 beta2,因为我在 CREATE TRIGGER 请求中使用了它,但事实并非如此,我的触发器是在默认 public 架构中创建的......为什么?

【问题讨论】:

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

标签: postgresql triggers schema


【解决方案1】:

我认为混淆在于触发器存在的架构与触发器的 search_path,即您调用的函数的架构。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多