2017-12-02 14 views
0

とテーブルにトリガーコピー私は非常に単純なトリガーを持っているコピー"UPDATE FOR ... SELECT * FROM DELETED" 2つの余分な列

  • Authorsの現在の行:AuthorID(PK)AuthorNameBio

  • AuthorsHistoryHistoryID(PK)AuthorIDAuthorNameBiohWhen(dateTime)

hWhenは、その値を記入するためにgetDate()を使用します。

CREATE TRIGGER [dbo].[AuthorHistory] 
ON [dbo].[B_Authors] 
FOR UPDATE 
AS 
    INSERT INTO B_AuthorsHistory 
     SELECT * 
     FROM deleted 

さらに多くの列がありますが、この点については関係ありません。すべての列は、PKの変更以外の同じ型、同じnull設定、同じデフォルト値です。

これは完全に機能しますが、今日は列を追加したかったのです。

  • Authorsに追加しようとしましたが、すぐにトリガーの列リストについて何かエラーが発生しました。 (私はSelect *を使用しています)
  • 私はAuthorsHistoryに最初に列を追加しましたが、もう一度Authorsを試してみましたが、それはトリガーに直接言及して別のエラーを投げました。

(これはまだそれを構築し、現時点では問題ではありません)私は、トリガーを追加し、列を調整し、トリガーを削除し、解像度を見つけましたが、私はまた、一時的にAuthorsHistoryからhWhenを削除する必要がありました。

もう1つのオプションは、おそらく列名と値に固有のものです。 私はコードでこれを行いますが、私はそれを避けることができれば、更新することは1つ少ないという考えが好きです。

質問:SELECT *でこれを行う方法はありますか?**他のテーブルにも同じトリガー(つまり、 "Products ==> ProductsHistory")があります。私が見たよう

+1

SSMSデザイナを使用して列を追加しないでください。TSQLを使用するだけであれば、両方のテーブルに順番に追加することができます。例えばhttp://rextester.com/NNIWQN4856 –

+0

よろしくお願いいたします。 @MartinSmith –

答えて

1

、そのトリガーが失敗しないように、両方のテーブルに新しい列を追加する唯一の方法は、そのような1つのクエリでそれを行うことです。

;disable trigger dbo.AuthorHistory on dbo.B_Authors; 

alter table dbo.B_Authors add NewColumn int null; 

alter table dbo.B_AuthorsHistory add NewColumn int null; 

;enable trigger dbo.AuthorHistory on dbo.B_Authors; 

しかし、あなたは高いがあれば他のトランザクションがクエリの途中でdbo.Authorsのデータを変更した場合は、の一部のデータが失われる可能性があります。

+1

私の解釈は、同時実行ではなく列を追加するときに見ているということです。これはSSMSがテーブルを再作成して(新しいcolummを使用して)、変更が行われた後に(現在は同期外に)起動されることによって説明されます。うまくいけば、彼らは生産に変更を加えるためにSSMSテーブルデザイナーを使用することはありません。 –

+0

私は同意します。とにかく 'select *'を使わない方が良いでしょう。 – GriGrim

+0

監査トリガーは個人的に私が 'SELECT *'に満足しているケースです。つまり、ベーステーブルに新しい列を追加すると、それを履歴テーブルに追加することを忘れることは事実上不可能です(不一致のためランタイムエラーが発生するため) –

関連する問題