2011-06-29 16 views
3

あなたがこれを理解できるなら、あなたは真のSQLの達人です!それは私が今まで見た中で最も奇妙なものの一つです。トリガーはどのように削除されましたか?

データベースのテーブルにトリガーを追加しました。サーバーはSQL 2008です。トリガーは特にトリッキーなことはしません。特定のフィールドが変更されたときにテーブルのLastUpdatedフィールドを変更するだけです。これは「更新後」トリガーです。

このデータベースに対してあらゆる種類の膨大なクエリを実行する大規模なC++レガシーアプリケーションがあります。どういうわけか(私は、このトリガーを削除しているかどうか全く分かりません)。他のトリガーは削除されず、トリガーやテーブルを明示的に削除していないことが確かです。このアプリの開発者は私のトリガーについて何も知らない。

これはどのように可能ですか?

SQL Server Profilerを使用してトレースを実行しようとしましたが、SQL Management Studioを使用して送信および実行する各コマンドを実行しましたが、トリガーには影響しません。私はアプリを実行するときに発生するように見えます。 WTF :(

UPDATE:

申し訳ありませんが、私はあなたの時間を無駄にしたくない、私はちょうど私がトリガの名前を変更した場合、それは削除されませんのでさらに私はトリガーを変更した場合に実現。他のデベロッパーが明示的に削除しているとしか思えませんが、私はトリガー名のトレースを検索しましたが、そこにはありません。そして、彼らが言うことを見るの提案をありがとう

UPDATE 2:。。

他の開発者が、彼らはそれを元に削除されていないことを数えます明白に。 sys.objectsやsys.triggersには存在しないので、SSMSの不具合ではありません。私はあなたの名前を聞いたことがありますか?私はあなたの名前を聞いたことがありますか?それは完全に削除されていますまた、問題は実際のトリガーの内容に関連していません私が述べたように、私は内容を削除し、何もしない非常に単純なコードで置き換え、それでもそれは削除されます。

表中のMERGEコマンドを使用して

乾杯
マークが

+0

トリガーが自動的に削除される唯一のものではないようです:http://stackoverflow.com/questions/2954635/mysql-trigger-gets-deleted-automatically – Fortega

+0

トリガーを削除しているかのように見えますか?トリガはすべての状況で発射/作動していませんか?後者の場合、私たちはおそらくトリガーの本体を見る必要があるでしょう(しかし、私の推測は、挿入/削除された単一の行を引き受けるトリガーになるでしょう) –

+0

@Fortega:それはMySQL用です – gbn

答えて

4

思考を得る原因となります。

トリガーを削除するには
  • アプリで使用すべきではない= ALTER権限が必要です
  • トリガーは、ALTER TABLEで無効にすることができます
  • トリガトラップダミーに先頭に@@ ROWCOUNTのためにテストすることにより、混乱することができます更新など
  • トリガーは単一行のみのコードで実行されないように表示されます
  • トリガーはsys.objects/sysに存在しますか?トリガー:SSMS
  • はトリガーを削除することができるでオブジェクトエクスプローラに依存しない表がドロップされると、トリガが、私は同じだった
+0

こんにちは@GBN。あなたの有益なコメントをありがとう。私はsysテーブルをチェックし、トリガは本当に削除されます。失敗したり、問題が発生したりしません。それは完全に削除されました。他のアプリに設定されているアクセス許可については、私はあまりお手伝いできません。私はちょうどそれが削除されないので、それをリネームするつもりです。多分いつか私はここで何が起こっているかを見つけるでしょう。乾杯。 –

-1

チェックそれがトリガーはエラー

+0

私はそれに誤りがあったとは言わなかった。私はそれが削除されたと言いました。 –

1

TRUNCATE表のために発生しません

  • を再作成した場合私は最終的なGOステートメントがない作成スクリプトに追跡しました。

    スクリプト1

    IF EXISTS (....) 
        DROP PROC MyProc 
    GO 
    
    CREATE PROC MyProc 
    ..... 
    /* GO statement is missing */ 
    

    スクリプト私はそれがこのように見えたオブジェクトエクスプローラでMyProcを視察2

    IF EXISTS (....) 
        DROP TRIGGER MyDisappearingTrigger 
    GO 
    
    CREATE TRIGGER MyDisappearingTrigger 
    ..... 
    GO 
    

    :だから

    CREATE PROC MyProc 
    AS 
    ... 
    
    IF EXISTS (....) 
        DROP TRIGGER MyDisappearingTrigger 
    GO 
    

    これは、ストアドプロシージャが呼び出されるたびにトリガも削除されることを意味しました。

  • 関連する問題