jba*_*eda 46 sql postgresql triggers
我想"创建或替换"postgres表的触发器.但是,没有这样的sql表达式.
我看到我可以先做一个"DROP TRIGGER IF EXISTS"(http://www.postgresql.org/docs/9.5/static/sql-droptrigger.html).
我的问题是:
请注意,oracle中存在"创建或替换触发器"(https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm).然后,
X-C*_*der 58
无法创建或替换触发器,但可以这样做
DROP TRIGGER IF EXISTS yourtrigger_name on "yourschemaname"."yourtablename";
Run Code Online (Sandbox Code Playgroud)
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语法
Bru*_*uno 17
从 PostgreSQL 14 开始,CREATE TRIGGER现在也支持“ OR REPLACE”。
您现在可以使用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
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)
您可以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)
你可以使用下面的代码。
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)
| 归档时间: |
|
| 查看次数: |
25159 次 |
| 最近记录: |