创建或替换触发器postgres


68

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

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

我的问题是:

  1. 是否有比(DROP+CREATE触发器)更推荐/更好的选择
  2. 有没有为什么没有这样的“创建或替换触发器”的原因(这可能意味着我不应该这样做)

请注意,Create or Replace Trigger在oracle(https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm)中有一个“ ” 。然后,

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

Answers:


32

PostgreSQL有事务DDL,所以BEGIN > DROP > CREATE > COMMIT等价于CREATE OR REPLACE

是一篇有关postgre的事务性DDL与其他系统(例如oracle)相比的不错的文章。

当前有关触发器的postgres计划功能不包括添加REPLACE语法。


46
为什么postgreql允许CREATE OR REPLACE FUNCTION但不允许CREATE OR REPLACE TRIGGER...如果要遵循一个概念,则应该为功能太正确而强制执行它?还是我错了?
水晶圣骑士

现在向我提问一百万美元,寻求真相!
MA Hossain Tonu

1
我认为也许其他对象也可以依赖触发器,如果​​删除触发器,它也会删除其他对象(在级联的情况下)。
伊斯特万·德布伦特伊(IstvánDöbrentei)

1
这不是真的。由于ERROR: cannot drop view currency_rate because other objects depend on it DETAIL: composite type consume_info column currency_rate depends on type currency_rate
Eugen Konkov '19

83

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

DROP TRIGGER IF EXISTS yourtrigger_name on "yourschemaname"."yourtablename";

3
繁荣。您从字面上拯救了我的生命
Sonic Soul,

20

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

例:

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();

3

您可以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;
$$

2

您可以使用以下代码。

DO $$ BEGIN

CREATE (trigger, type , ...);

EXCEPTION
  WHEN others THEN null;
END $$;

样品:

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 $$;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.