2013-04-08 59 views
1

我們正在向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 @命令並且照顧那些事情?

任何幫助將不勝感激!

謝謝! 鮑勃

回答

0
  1. 必須指定一個UPDATE
  2. 列名,你可以通過目標表的元數據環(在sys.columns),並動態地構建一個UPDATE聲明,而是動態的SQL在自己的範圍內執行,所以它不能直接訪問inserteddeleted表。雖然你可以變通的作法是將數據複製到本地的臨時表(#inserted)首先,好像一般
  3. 一個非常尷尬的方法有沒有辦法訪問原始UPDATE聲明

但我米不知道你真的想達到什麼。您的問題意味着觸發器無論如何都會執行原始INSERTUPDATE而不修改任何數據。如果情況確實如此,你可能想要解釋觸發器的用途是什麼,因爲可能有一種更簡單的方法可以做它正在做的事情。

我對你的陳述感到有點困惑,你必須「爲每個傳入列聲明變量,然後使用UPDATE TableName SET ColumnName = @col1等中的變量」。 SQL Server中的觸發器總是每個語句觸發一次,因此通常會執行UPDATE with a join來處理UPDATE用於多行的情況。

您可能還會發現UPDATE()COLUMNS_UPDATED()函數可用於限制觸發器代碼僅處理真正更新的列。

+0

感謝您的回覆。我們有大量的DB2 BEFORE UPDATE觸發器。這些觸發器需要轉換爲SQL Server。觸發器基本上處理數據驗證,因此當有人更新記錄時,觸發器將對發送到更新的數據進行一些驗證檢查,如果一切正常,則會允許更新發生。如果驗證失敗,它會停止更新並返回錯誤。 – Bob 2013-04-09 13:44:04

+0

問題是在SQL Server中沒有BEFORE UPDATE,所以我發現的最接近的是INSTEAD OF UPDATE。問題在於驗證發生,如果它通過,沒有任何反應,如果它失敗,它會返回一個錯誤。所以我必須在pass狀態下自己做更新。問題是我需要找到儘可能多的自動化過程。必須知道更新的各個列名稱使得這遠遠不能自動化。我會檢查出UPDATE()和COLUMNS_UPDATED()函數。 – Bob 2013-04-09 13:47:58

+0

額外的信息是有幫助的,雖然我不認爲它會改變我的答案。如果我有這個需求,我可能會編寫一個腳本 - 不一定在TSQL中 - 爲每個表生成一個觸發器「模板」(通過從sys.columns獲取列名),包括插入「UPDATE」語句'然後只需添加我的驗證代碼。我假設你的驗證碼對於每個表都是不同的,所以你需要維護每張表的觸發源代碼。 – Pondlife 2013-04-09 14:37:01