代码之家  ›  专栏  ›  技术社区  ›  Matt

在RDB中使用数据库触发器和递归很有趣

  •  0
  • Matt  · 技术社区  · 15 年前

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

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

    所以我编了一个剧本 触发 在表中,这将在插入或更新时将值设置回预设值。

    数据库是运行在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社区对此进行思考。]

    提前谢谢

    1 回复  |  直到 15 年前
        1
  •  2
  •   Alex    15 年前

    编辑:似乎是Oracle RDB just plain doesnt execute nested triggers 这会导致递归。从报纸上看:' 只要不发生递归,触发器就可以嵌套其他触发器。 “我将把剩下的答案留给其他任何想知道其他DBS中递归触发器的人。

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

    其次,我建议也许有一种更好的方法可以在不使用触发器的情况下获得这个功能。你可以得到 view based row level security with SQL Server . 使用Oracle VPD也可以实现相同的结果。

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

    推荐文章