sql - 如何给 PostgreSQL 中的 Trigger 函数提供参数?

标签 sql postgresql

我有一个表 needitems 如下:

itemid   qty 
  5       10
  3       20

我写了一个触发器,在插入/更新/删除时它会复制记录并将其保存在表日志中:neededitems_log

问题是我还需要知道 productid。该信息在执行插入/更新/删除的函数中是可用的...但是在触发器中我无法访问它。执行插入/更新/删除的函数如何将变量传递给触发器? 如果做不到我能做什么?

以上面的例子...

假设函数 X 确实更新了 itemid 从 productid 5555 的数量 10 到数量 15...我想要 neededitems_log 显示:

itemid   qty productid
  5       15   5555

最佳答案

您不能将参数动态传递给触发器。任何干净的机制都是不可能的。很少有丑陋的方法—— session 变量和其他方法,但我不能建议它。当您觉得触发器需要额外的参数时,那么您的设计是错误的。所以不要这样做

触发器在轻量级时很好用 - 触发器应该主要用于检查和审计。当您需要更复杂的工作时,您应该使用经典功能。函数的参数化更强,可维护性更好。太复杂的触发器是位陷阱,通常会导致严重的失败。

如果你真的需要它——那么 session 变量比其他丑陋的解决方案错误更少:

postgres=# do $$
begin
  perform set_config('custom.var1', 10::text, true);
  raise notice 'session variable var1 = %', current_setting('custom.var1');
end;
$$;
NOTICE:  00000: session variable var1 = 1
DO

关于sql - 如何给 PostgreSQL 中的 Trigger 函数提供参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418756/

相关文章:

sql - 可以包含空子集的多个外连接

postgresql - Docker Compose 和 Postgres : Name does not resolve

postgresql - Postgis - 无法在 linux mint mate 17 上安装它

postgresql - Ant、execute-sql-script 和 PostgreSQL 的错误

sql - 更新语句检索到不正确的值

sql - 如何使用 'or' 语句定义从 postgresql 表中进行选择的条件?

sql - IS FALSE 和 = 'f' 在 Postgres 和索引使用中的区别

php - 生成sql脚本而不是直接访问数据库,如何防止sql注入(inject)漏洞?

sql - 我应该如何将统计数据保存到数据库

SQL Server 2008 SSIS : Importing date field incorrectly (from Oracle)