Tsql 触发不拯救历史
版本:SQL Server 2008 R2 此触发器检查主键冲突(如果有),将行移动到历史记录表;然后删除该行;然后插入导致冲突的行 但它没有做好自己的工作Tsql 触发不拯救历史,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,版本:SQL Server 2008 R2 此触发器检查主键冲突(如果有),将行移动到历史记录表;然后删除该行;然后插入导致冲突的行 但它没有做好自己的工作 CREATE TRIGGER [dbo].[ONINSERT] ON [dbo].[TICKETS] Instead of INSERT AS BEGIN DECLARE @ID VARCHAR(200) SET NOCOUNT ON; SET @ID = (SELECT TICKET_ID FROM ins
CREATE TRIGGER [dbo].[ONINSERT]
ON [dbo].[TICKETS]
Instead of INSERT
AS
BEGIN
DECLARE @ID VARCHAR(200)
SET NOCOUNT ON;
SET @ID = (SELECT TICKET_ID FROM inserted)
INSERT TICKET_HISTORY
SELECT * FROM TICKETS
WHERE
TICKET_ID = @ID ;
print 'Inserting ' + @id
DELETE FROM TICKETS
WHERE TICKET_ID = @ID;
print 'Deleting' + @id
INSERT TICKETS
SELECT * FROM inserted;
print 'Inserting back' + @id
即使有多个插入,触发器也只会触发一次,因此在您的情况下,我看不到会发生这种情况……您不需要再次删除该行,因为instead of insert通常意味着instead of insert执行一些自定义操作
if exists
(
select 1 from inserted i
join
mytable t
on t.id=i.id
)
begin
--insert into tickets history
insert into ticketshistory
select i.* from inserted i
join
mytable t where t.id=i.id
---you can add custom logic to alert or simply ignore
return
end
--this is needed since if there is no violation you have to insert rows
insert into tickets
select * from inserted
“插入”和“删除”是表,因此它们可以表示集合操作的结果。在假设触发器总是只处理一行的情况下设计触发器通常是一个糟糕的计划。如果您绝对确定不会有超过一行,那么请添加对行数的检查,并使用RaIsError或Throw显式通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1,则会出现错误“FooTable_Insert:最多只能处理一行”。、25、42以及日志