创建或替换触发器postgres

jba*_*eda 46 sql postgresql triggers

我想"创建或替换"postgres表的触发器.但是,没有这样的sql表达式.

我看到我可以先做一个"DROP TRIGGER IF EXISTS"(http://www.postgresql.org/docs/9.5/static/sql-droptrigger.html).

我的问题是:

  1. 是否有推荐/更好的选项(DROP + CREATE触发器)
  2. 是否有一个原因,为什么没有这样的"创建或更换触发器"(这可能意味着我不应该想这样做的话)

请注意,oracle中存在"创建或替换触发器"(https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm).然后,

  1. 这个命令是否计划用于Postgres?

X-C*_*der 58

无法创建或替换触发器,但可以这样做

DROP TRIGGER IF EXISTS yourtrigger_name on "yourschemaname"."yourtablename";
Run Code Online (Sandbox Code Playgroud)

  • 繁荣。你真的救了我一命 (2认同)
  • ..然后使用“CREATE TRIGGER...”查询 (2认同)

Kru*_*rut 21

Postres有事务DDL所以BEGIN > DROP > CREATE > COMMIT is the equivalent ofCREATE OR REPLACE`

https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis对postgre的事务性DDL与其他系统(如oracle)的比较是一个很好的写法

关于触发器的当前postgres计划功能(https://wiki.postgresql.org/wiki/Todo#Triggers)不包括添加REPLACE语法

  • 为什么postgreql允许"创建或替换功能"而不是"创建或替换触发器"...如果它要遵循一个概念,它应该强制执行它的功能太正确了吗?或者我错了? (26认同)

Bru*_*uno 17

从 PostgreSQL 14 开始,CREATE TRIGGER现在也支持“ OR REPLACE

\n

您现在可以使用CREATE OR REPLACE TRIGGER ...(而不是DROP TRIGGER IF EXISTS先使用)。

\n

这似乎也可以明智地处理分区表的情况:

\n
\n

在分区表上创建行级触发器将导致在其每个现有分区上创建相同的 \xe2\x80\x9cclone\xe2\x80\x9d 触发器;并且稍后创建或附加的任何分区也将具有相同的触发器。如果子分区上已存在名称冲突的触发器,则除非使用 CREATE OR REPLACE TRIGGER,否则会发生错误,在这种情况下该触发器将替换为克隆触发器。当分区与其父分区分离时,其克隆触发器将被删除。

\n
\n

另外值得注意的是:

\n
\n

目前,约束触发器不支持 OR REPLACE 选项。

\n
\n


Vla*_*den 12

您应该使用两个语句:一个用于放置触发器,另一个用于创建触发器。

例:

DROP TRIGGER IF EXISTS my_trigger
  ON my_schema.my_table;
CREATE TRIGGER my_trigger
  BEFORE INSERT OR UPDATE
  ON my_schema.my_table
  FOR EACH ROW EXECUTE PROCEDURE my_schema.my_function();
Run Code Online (Sandbox Code Playgroud)

  • 在上面点击“BEGIN;”和“COMMIT;”,你应该就可以了。 (2认同)

adr*_*aan 6

您可以CREATE OR REPLACE FUNCTION trigger_function在 SQL 中结合以下脚本:

DO $$
BEGIN
  IF NOT EXISTS(SELECT *
    FROM information_schema.triggers
    WHERE event_object_table = 'table_name'
    AND trigger_name = 'trigger_name'
  )
  THEN
    CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW EXECUTE PROCEDURE trigger_function();
  END IF;
END;
$$
Run Code Online (Sandbox Code Playgroud)


Ali*_*eri 5

你可以使用下面的代码。

DO $$ BEGIN

CREATE (trigger, type , ...);

EXCEPTION
  WHEN others THEN null;
END $$;
Run Code Online (Sandbox Code Playgroud)

样本:

DO $$ BEGIN

CREATE TRIGGER trigger_workIDExist
  BEFORE INSERT OR UPDATE ON "GalleryModel"
  FOR EACH ROW EXECUTE PROCEDURE check_workIDExist();

EXCEPTION
  WHEN others THEN null;
END $$;
Run Code Online (Sandbox Code Playgroud)