2012-02-21 14 views
0

特定の列に対して変更を加えると、その列に対して更新をトリガーしたい。変更時に列を特定の値に強制的に更新する

(ヒストリー:アプリケーションによっては列の更新が行われているため、アプリを見つけることができません。そのため、強制的に値を強制的に取り戻すためにトリガーを設定しました)。

それを簡単にする。..

UsrTbl: 
usrid usr pwd 
1001 admin qwerty 
2001 cto demo 
3001 ceo demo 
... 

誰かがusrが管理者である障害者の更新を行う場合、私は特定の値にそれを再更新したいです。私はトリガーを行う場合

、のようなもの:

CREATE TRIGGER the_usr_trg ON usrtbl AFTER UPDATE AS 
UPDATE usrtbl SET pwd='qwerty' WHERE usr = 'admin' 
GO 

は、上記の私のためにこの問題を解決するのでしょうか? トリガが列を更新するとどうなりますか?それはthe_usr_trgトリガをもう一度起動しますか?これはデータベースサーバーのループを引き起こしますか?またはそれは一度だけ実行されますか? これを修正する方が良いでしょうか? (この列を更新しているアプリを見つける以外に):

ありがとう!

+0

あなたの開発環境でそれを行い、何が起こるかを見てください。 – cadrell0

+0

パスワードを平文として保管しているのはなぜですか?なぜあなたは 'TRIGGER'の中にパスワードを平文として保存したいのですか? – JNK

+1

パスワードを変更したくない場合は、それをテーブルに保存する理由は何ですか?プレーンテキストではありませんか? –

答えて

1

DB上にあるトリガーの再帰レベルに依存すると私は信じています。 RECURSIVE_TRIGGERSOFFに設定されている場合は、1回だけ実行されます。あなたのケースでは、INSTEAD OFトリガーを作成すると、テーブル上に最初のUPDATEが表示されないようにする方が良いでしょう。あなたのケースでは、このようなものになるだろう:あなたは、次のステートメントを使用してそれらを指示しない限り、デフォルトで

CREATE TRIGGER the_usr_trg ON usrtbl 
INSTEAD OF UPDATE 
AS 
BEGIN 

    UPDATE A 
    SET pwd= B.pwd 
    FROM usrtbl A 
    INNER JOIN INSERTED B 
     ON A.usr = B.usr 
    WHERE usr != 'admin' 

END 
1

トリガーは自分自身を再帰的に呼び出すことはありません:

SET RECURSIVE_TRIGGERS ON 

あなたのコードが正常に動作する必要があります。

0

@ cadrell0のコメントによれば、開発環境でテストして再帰があるかどうかを確認できます。

さらに大きな問題は、システムのビューsys.trigger_eventsや監査テーブルを実装するなどの根本的な原因を調べるのではなく、値をリセットしてクラックをペーパートすることです。トリガーを使用する方法)を使用して、値が変更された時期と理由を確認します。あなたのトリガーで再帰を避けるために、それはプレーンテキストでパスワードを保存するためにとても残念だという事実を無視

...

あなたは(提案された変更を参照するか、トリガ更新を使用するように挿入テーブルを使用することができます)列が変更されたかどうかを調べる関数です。列が既に希望の値に設定されている場合は、再度更新する必要はありません。

関連する問題