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は、再帰を引き起こすネストされたトリガーを単純に実行しないようです。論文から:'再帰が発生しない限り、トリガーは他のトリガーをネストできます。'他のDBでの再帰的トリガーについて疑問に思っている人のために、残りの答えはここに残しておきます。

まず最初にあなたの質問に答えます-それはデータベースに依存します。作業中のインスタンスでトリガー再帰がオフになっている可能性は十分にあります。ご想像のとおり、トリガーの再帰は、正しく処理されない場合、あらゆる種類の混乱を引き起こす可能性があるため、SQLServerでは完全に無効にすることができます。

次に、トリガーなしでこの機能を取得するためのより良い方法があることをお勧めします。SQLServerを使用してビューベースの行レベルのセキュリティを取得できます。OracleVPDでも同じ結果を得ることができます。

または、保護しようとしている構成値の場合、それらをすべて1つのテーブルにグループ化し、そのテーブルにアクセス許可を適用します(行ベースのセキュリティよりも単純です)。

于 2009-12-11T11:55:39.767 に答える