2009-12-11 22 views
0

本周我有一个问题(幸好我解决了一个更好的方法);有趣的数据库触发器和RDB中的递归

  • 我需要保持数据库中的几个字段常量。

所以,我敲了一个脚本来放置触发在桌子上,将设定值回预设数量时,无论是插入或更新发生。

数据库是在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社区对此的看法。 ]

在此先感谢

回答

2

编辑:看来甲骨文RDB just plain doesnt execute nested triggers导致递归。从纸上:'只要不发生递归,触发器就可以嵌套其他触发器。'我会留下其余的答案给其他人想知道其他数据库中的递归触发器。

那么首先要回答你的问题 - 这取决于数据库。您正在使用的实例上完全可能有trigger recursion is turned off。如你所想,如果处理不当,触发递归可能会导致各种混乱,因此SQL Server允许你完全禁用它。其次,我会建议也许有一个更好的方式来获得这个功能没有触发器。你可以得到view based row level security with SQL Server。 Oracle VPD可以实现相同的结果。

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

+0

是它的一个潜在的噩梦。调试问题也非常困难,因为触发是'隐藏'的,也是我最后看的地方。我不知道你可以在sql server上关闭它。尽管这个数据库是RDB。 – Matt 2009-12-11 12:02:50

+0

这样做肯定有更好的方法我同意 - 我只是想知道它背后的技术性 – Matt 2009-12-11 12:04:39

+0

对不起,我没有看到RDB标签 - 但看起来这种行为是有意设计的。 – Alex 2009-12-11 12:09:37