PostgreSQL能否在触发器定义中直接定义内联触发函数?
能否在PostgreSQL触发器定义中直接编写触发动作,无需创建命名触发器函数?
我希望通过触发器调用函数,但无需将其存储为命名存储过程,请问是否可以直接在触发器定义中编写触发动作?
常见的标准合法写法
CREATE FUNCTION notify() RETURNS TRIGGER AS $$ BEGIN RAISE NOTICE 'Nice'; RETURN NEW; END $$ LANGUAGE 'plpgsql'; CREATE TRIGGER notify_at_insert BEFORE INSERT ON foo FOR EACH ROW EXECUTE FUNCTION notify();
我期望的近似写法(当前无效)
CREATE TRIGGER notify_at_insert BEFORE INSERT ON foo FOR EACH ROW EXECUTE $$ BEGIN RAISE NOTICE 'Nice'; END $$ LANGUAGE 'plpgsql'
回答
在PostgreSQL中不支持直接在CREATE TRIGGER语句内嵌入匿名代码块,触发器必须绑定一个预先定义好的、返回TRIGGER类型的函数。这是PostgreSQL的语法规范要求:EXECUTE FUNCTION子句后只能跟已存在的触发器函数名称,无法直接执行匿名PL/pgSQL代码。
如果不想在永久数据库对象中保留命名函数,可以使用临时触发器函数替代,临时函数仅在当前会话中存在,会话结束后会自动销毁,示例如下:
CREATE TEMP FUNCTION temp_notify() RETURNS TRIGGER AS $$ BEGIN RAISE NOTICE 'Nice'; RETURN NEW; END $$ LANGUAGE plpgsql; CREATE TRIGGER notify_at_insert BEFORE INSERT ON foo FOR EACH ROW EXECUTE FUNCTION temp_notify();
内容的提问来源于stack exchange,提问作者Khaled
相关产品推荐
相关产品推荐

