我們正在向SQL Server進行DB2遷移,並且有一些BEFORE插入/更新需要遷移。我們可以簡單地通過使用INSTEAD OF INSERT來簡單地使用命令「INSERT INTO TableName SELECT * FROM inserted」來處理插入。如何在觸發器中執行原始命令
但是,對於更新來說更難,因爲你不能像「UDPATE TableName SELECT * FROM Inserted」那樣執行命令,而是我們發現的唯一選擇是爲每個傳入列聲明變量,並且然後使用這些在UPDATE表名SET的ColumnName = @ COL1等不幸的是,這將導致相當多的體力勞動,我想找到一個更自動化的解決方案
一些問題: 1)是有沒有一種方法可以使用從觸發器插入來發布更新,而無需知道特定的列信息?
2)有沒有辦法在觸發器中編寫一個循環來自動遍歷插入的列,並更新t軟管到數據庫? 3)有沒有辦法訪問導致觸發器的原始命令?所以我可以做一個EXEC @命令並且照顧那些事情?
任何幫助將不勝感激!
謝謝! 鮑勃
感謝您的回覆。我們有大量的DB2 BEFORE UPDATE觸發器。這些觸發器需要轉換爲SQL Server。觸發器基本上處理數據驗證,因此當有人更新記錄時,觸發器將對發送到更新的數據進行一些驗證檢查,如果一切正常,則會允許更新發生。如果驗證失敗,它會停止更新並返回錯誤。 – Bob 2013-04-09 13:44:04
問題是在SQL Server中沒有BEFORE UPDATE,所以我發現的最接近的是INSTEAD OF UPDATE。問題在於驗證發生,如果它通過,沒有任何反應,如果它失敗,它會返回一個錯誤。所以我必須在pass狀態下自己做更新。問題是我需要找到儘可能多的自動化過程。必須知道更新的各個列名稱使得這遠遠不能自動化。我會檢查出UPDATE()和COLUMNS_UPDATED()函數。 – Bob 2013-04-09 13:47:58
額外的信息是有幫助的,雖然我不認爲它會改變我的答案。如果我有這個需求,我可能會編寫一個腳本 - 不一定在TSQL中 - 爲每個表生成一個觸發器「模板」(通過從sys.columns獲取列名),包括插入「UPDATE」語句'然後只需添加我的驗證代碼。我假設你的驗證碼對於每個表都是不同的,所以你需要維護每張表的觸發源代碼。 – Pondlife 2013-04-09 14:37:01