公司 a 使用 sql server 2005 数据库。来自贸易伙伴的客户数据每天晚上都要导入到客户表。你要确保,在导入的过程中,对于存在的客户数据进行更新、对于不存在的客户数据进行插入。 无 /*instead of 触发器的主要优点是可以使不能更新的视图支持更新。包含多
公司 a 使用 sql server 2005 数据库。来自贸易伙伴的客户数据每天晚上都要导入到客户表。你要确保,在导入的过程中,对于存在的客户数据进行更新、对于不存在的客户数据进行插入。 /*instead of 触发器的主要优点是可以使不能更新的视图支持更新。包含多个基表的视图必须使用 instead of 触发器来支持引用表中数据的插入、更新和删除操作。instead of 触发器的另一个优点是使您得以编写这样的逻辑代码:可以拒绝批处理中的某些部分同时允许批处理的其它部分成功。instead of 触发器可以进行以下操作: 忽略批处理中的某些部分。不处理批处理中的某些部分并记录有问题的行。如果遇到错误情况则采取备用操作。 说明 在含有用 delete 或 update 操作定义的外键的表上,不能定义 instead of delete 和 instead of update 触发器。将此逻辑作为 instead of 触发器的一部分进行编码,可避免所有访问数据的应用程序必须重新执行该逻辑。在下列 transact-sql 语句序列中,instead of 触发器更新视图中的两个基表。另外,显示两种处理错误的方法: 忽略对 person 表的重复插入,并且插入的信息将记录在 personduplicates 表中。将对 employeetable 表的重复插入转变为 update 语句,该语句将当前信息检索至 employeetable,而不会产生重复键侵犯。 transact-sql 语句创建两个基表、一个视图、一个记录错误表和视图上的 instead of 触发器。下面的这些表将个人数据和业务数据分开并且是视图的基表:*/create table person ( ssn char(11) primary key, name nvarchar(100), address nvarchar(100), birthdate datetime )create table employeetable ( employeeid int primary key, ssn char(11) unique, department nvarchar(10), salary money, constraint fkempper foreign key (ssn) references person (ssn) )--下面的视图使用某个人的两个表中的所有相关数据建立报表:create view employee asselect p.ssn as ssn, name, address, birthdate, employeeid, department, salaryfrom person p, employeetable ewhere p.ssn = e.ssn--可记录对插入具有重复的社会安全号的行的尝试。personduplicates 表记录插入的值、尝试插入操作的用户的用户名和插入的时间:create table personduplicates ( ssn char(11), name nvarchar(100), address nvarchar(100), birthdate datetime, insertsname nchar(100), wheninserted datetime )--instead of 触发器在单独视图的多个基表中插入行。将对插入具有重复社会安全号的行的尝试记录在 personduplicates 表中。将 employeetable 中的重复行更改为更新语句。create trigger io_trig_ins_employee on employeeinstead of insertasbeginset nocount on-- check for duplicate person. if no duplicate, do an insert.if (not exists (select p.ssn from person p, inserted i where p.ssn = i.ssn)) insert into person select ssn,name,address,birthdate,comment from insertedelse-- log attempt to insert duplicate person row in personduplicates table. insert into personduplicates select ssn,name,address,birthdate,suser_sname(),getdate() from inserted-- check for duplicate employee. if no duplicate, do an insert.if (not exists (select e.ssn from employeetable e, inserted where e.ssn = inserted.ssn)) insert into employeetable select employeeid,ssn, department, salary,comment from insertedelse--if duplicate, change to update so that there will not--be a duplicate key violation error. update employeetable set employeeid = i.employeeid, department = i.department, salary = i.salary, comment = i.comment from employeetable e, inserted i where e.ssn = i.ssnend