0

本周我遇到了一个问题(谢天谢地,我已经以更好的方式解决了);

  • 我需要在数据库中保持几个字段不变。

因此,我编写了一个脚本以在表上放置一个触发器,当插入或更新发生时,它将将该值设置回预设数字。

该数据库是在 VMS 上运行的 RDB(但我很想知道 SQLServer 的相似之处)。

以下是触发器:

drop trigger my_ins_trig;
drop trigger my_upd_trig;

  !
  !++ Create triggers on MY_TABLE
  CREATE TRIGGER my_ins_trig AFTER INSERT ON my_table
         WHEN somefield = 2
  (UPDATE my_table table1
   SET table1.field1 = 0.1,
       table1.field2 = 1.2
   WHERE  my_table.dbkey = table1.dbkey)
  FOR EACH ROW;

  CREATE TRIGGER my_upd_trig AFTER UPDATE ON my_table
         WHEN somefield = 2
  (UPDATE my_table table1
   SET table1.field1  = 0.1,
       table1.field2  = 1.2
   WHERE  my_table.dbkey = table1.dbkey)
  FOR EACH ROW;

提问时间

我希望这会形成无限递归 - 但它似乎没有?谁能向我解释 RDB 如何以这种或另一种方式处理......或其他数据库如何处理它。

[注意:我知道这是一种糟糕的方法,但各种问题和复杂性意味着即使这在代码中很简单 - 它也不能以最好/最简单的方式完成。谢天谢地,我没有以这种方式实现它,但我想询问 SO 社区对此的看法。]

提前致谢

4

1 回答 1

2

编辑:似乎 Oracle RDB只是简单地不执行导致递归的嵌套触发器。来自论文:'只要不发生递归,触发器就可以嵌套其他触发器。' 我将把剩下的答案留给其他想知道其他数据库中的递归触发器的人。

那么首先回答你的问题 - 这取决于数据库。完全有可能在您正在处理的实例上关闭触发递归。可以想象,如果处理不当,触发器递归可能会导致各种混乱,因此 SQL Server 允许您完全禁用它。

其次,我建议也许有更好的方法可以在没有触发器的情况下获得此功能。您可以使用 SQL Server 获得基于视图的行级安全性。使用 Oracle VPD 可以实现相同的结果。

或者,如果您要保护其配置值,我会将它们全部分组到一个表中并对其应用权限(比基于行的安全性更简单)。

于 2009-12-11T11:55:39.767 回答