我在開發新軟件時對現有數據庫進行了更改。也有相當多的傳統軟件的使用,需要繼續使用的數據庫,也就是我想保持現有的數據庫表,特效等INSTEAD OF UPDATE觸發器和更新主鍵
目前,我有表
CREATE TABLE dbo.t_station ( tx_station_id VARCHAR(4) NOT NULL, tx_description NVARCHAR(max) NOT NULL, tx_station_type CHAR(1) NOT NULL, tx_current_order_num VARCHAR(20) NOT NULL, PRIMARY KEY (tx_station_id) )
我需要在此表中包含一個引用Plant(生產設施)的新字段,並將tx_current_order_num移動到另一個表,因爲它不是所有行都需要的。所以我創建新表: -
CREATE TABLE Private.Plant ( PlantCode INT NOT NULL, Description NVARCHAR(max) NOT NULL, PRIMARY KEY (PlantCode) ) CREATE TABLE Private.Station ( StationId VARCHAR(4) NOT NULL, Description NVARCHAR(max) NOT NULL, StationType CHAR(1) NOT NULL, PlantCode INT NOT NULL, PRIMARY KEY (StationId), FOREIGN KEY (PlantCode) REFERENCES Private.Plant (PlantCode) ) CREATE TABLE Private.StationOrder ( StationId VARCHAR(4) NOT NULL, OrderNumber VARCHAR(20) NOT NULL, PRIMARY KEY (StationId) )
現在,我不希望有兩個地方相同的數據,所以我決定改變dbo.t_station錶轉成視圖,並提供觸發的,而不是來執行DELETE,INSERT和UPDATE。沒問題,我有[大部分]他們工作。
我的問題是INSTEAD OF UPDATE觸發器,更新主鍵列(tx_station_id)並更新到多行。
在觸發塊內部,有沒有辦法加入插入和刪除的[psuedo]表,以便我知道「更新前的主鍵」和「更新後的主鍵」?事情是這樣的......
UPDATE sta SET sta.StationId = ins.tx_station_id FROM Private.Station AS sta INNER JOIN deleted AS del INNER JOIN inserted AS ins ON ROW_IDENTITY_OF(del) = ROW_IDENTITY_OF(ins) ON del.tx_station_id = sta.StationId
在這個階段,我已經把在觸發塊回滾更新檢查,如果主鍵列被更新,有不止一個行中插入或刪除,表。
我曾希望有人可能有更好的答案!這個問題也讓我過去煩惱了。 – 2009-10-26 02:04:01