2012-04-13 57 views
0

我想創建一個觸發器,該表格在更新表中的一行之前運行,並在行更新到存檔表之前將所有字段寫入該行。在更新之前訪問行字段所需的正確語法是什麼,以便我可以將它們寫入我的存檔表中?基本的SQL更新觸發器

編輯:

所以這應該做我想做的,但它似乎並沒有工作。我得到的錯誤「已經有名爲數據庫config_SystemSettings對象:

CREATE TRIGGER [config].[UpdateSystemSettings] 

ON [配置] [SystemSetting] UPDATE 以後爲 BEGIN

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

+0

可能重複的[如何做一個BEFORE UPDATE觸發器與SQL Server?](http://stackoverflow.com/questions/642822/how-can-i-do-a-before-updated-trigger-with -sql-server) – 2012-04-13 08:28:47

回答

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 2012-04-13 09:12:44

+0

對不起,意識到我不得不引用del.SettingId等而不是old.SettingId ....固定 – user517406 2012-04-13 09:14:15

+0

@ user517406 - 事實上,再次查看剩餘的查詢,不知道爲什麼你加入到'SystemSetting' - 當然''刪除'包含您需要的所有信息。 – 2012-04-13 09:20:48