2012-04-13 17 views
0

テーブル内の行が更新される直前に実行されるトリガーを作成し、行内のすべてのフィールドを更新してからアーカイブテーブルに書き込むトリガーを作成します。更新前に行フィールドにアクセスしてアーカイブテーブルに書き込むために必要な正しい構文は何でしょうか?基本的なSQL更新トリガー

EDIT:

だからこれは私が欲しいものを行う必要があり、動作するようには思えません。私は、エラーが「が既にデータベース内config_SystemSettingsと呼ばれるオブジェクトがあり得る:[設定] ON

CREATE TRIGGER [config].[UpdateSystemSettings] 

[SystemSetting] UPDATE AFTER AS

SET NOCOUNT ON; 

SELECT old.settingId, old.campId, old.settingKey, old.settingValue 
into [history].[config_SystemSettings] 
FROM [config].[SystemSetting] AS old 
INNER JOIN deleted AS del ON del.settingId = old.settingId 

END GO

をBEGIN
+0

可能な複製[SQL ServerでBEFORE UPDATEDトリガーを実行するにはどうすればよいですか?](http://stackoverflow.com/questions/642822/how-can-i-do-a-before-updated-trigger-with -sql-server) –

答えて

0

SELECT ... INTOは常に新しいテーブルを作成したいので、代わりにINSERT ... SELECTを使用してください:

CREATE TRIGGER [config].[UpdateSystemSettings] 

ON [config].[SystemSetting] AFTER UPDATE AS BEGIN 
SET NOCOUNT ON; 

insert into [history].[config_SystemSettings] (settingId,campId,settingKey,settingValue) 
SELECT old.settingId, old.campId, old.settingKey, old.settingValue 
FROM [config].[SystemSetting] AS old 
INNER JOIN deleted AS del ON del.settingId = old.settingId 

ただし、最初に[history].[config_SystemSettings]を明示的に作成する必要があります。

+0

これはテーブルに書き込みますが、古い値ではなく新しい値(更新後)を書き込むようです。私は '削除された'テーブルは古い値を保持すると思った? – user517406

+0

申し訳ありませんが、私はdel.SettingIdなどの代わりにold.SettingId ....を参照しなければならなかったことを認識しました。 – user517406

+0

@ user517406 - 確かに残りのクエリをもう一度見て、なぜあなたは 'SystemSetting' - 必ず 'deleted'に必要なすべての情報が含まれています。 –