我在开发新软件时对现有数据库进行了更改。也有相当多的传统软件的使用,需要继续使用的数据库,也就是我想保持现有的数据库表,特效等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