需要一个触发器来记录某个字段的更改情况!

时间:2022-03-22 15:03:25
有一个表:tblFiber
主键:strLotNumber 字符串类型,(还有很多字段)。还会用到这个表的另外一个lngModifiedUserID字段。

需要一个触发器来记录主键更改情况(会在程序判断主键是否有重复的)。

记录到另外一个表里面:tblFiberChanged(更改记录表)
lngAutoID,strLotNoOLD,strLotNoNew,lngModifiedUserID,dtmModified
自动ID,原来编号,新编号,修改用户,修改时间。

请大家帮忙!谢谢!

10 个解决方案

#1


create trgger tr_name on tblFiber
for update
as
begin    
    insert into 记录表
        select strLotNo from deleted,
       select strLotNo from inserted,
       --人从哪来?
       getdate()
end

#2


主健可更改最好不做主健,建一下唯一約束或索引

#3


如果是SQL2005用存儲過程

OUTPUT 子句 實現

#4


主健可更改,需要另一个不修改的唯一索引作为连接条件,否则最好不要用触发器了,在程序记录日志。

#5


create trgger tr_name on tblFiber
for update
as
begin    
    if Update(主键)
       insert into 记录表 select a.xx,b.xx ... from deleted a join inserted b on 条件
end

#6


create trigger updatePK
on tblFiber
after update
as
begin
if update(strLotNumber)
insert into tblFiberChanged
select a.strLotNumber,b.strLotnumber,CURRENT_USER,getdate()
from deleted a inner join inserted b on a.col2=b.col2 and a.col3=b.col3 and a.col4=b.col4 and .... --因为主键被修改了,所以要用其他能代表该行的列来对比.
end

#7


主键应该是很少更改的 经常用到的列。

#8



CREATE TRIGGER tr_tblFiber ON tblFiber
FOR UPDATE 
AS
IF @@ROWCOUNT>1 AND UPDATE(strLotNumber)
BEGIN
RAISERROR 50001N'多條更改'
ROLLBACK TRAN
RETURN
END
--以下自己加上列名
INSERT INTO tblFiberChanged
SELECT d.strLotNumber AS strLotNoOLD,i.strLotNumber AS strLotNoNew 
FROM INSERTED AS i,DELETED d

#9


先谢谢大家!
strLotNumber 应该是不可以重复的。这个不是用来连接用的。我的连接是用另外一个ID字段。

#10


在程序中测试过,可以了。
谢谢roy_88,也谢谢大家!
CREATE TRIGGER [trgLotNoChangeLog] ON [dbo].[tblFiber]
FOR UPDATE 
AS 
IF @@ROWCOUNT>1 AND UPDATE(strLotNumber)
BEGIN
    RAISERROR 50001N'多條更改'
    ROLLBACK TRAN
    RETURN
END
--以下自己加上列名
INSERT INTO tblFiberChanged 
SELECT d.strLotNumber AS strLotNoOLD,i.strLotNumber AS strLotNoNEW,i.lngModifiedUserID,GetDate() 
FROM INSERTED AS i,DELETED AS d

刚刚去学习触发器的相关内容:http://blog.csdn.net/a9529lty/article/details/6134226

#1


create trgger tr_name on tblFiber
for update
as
begin    
    insert into 记录表
        select strLotNo from deleted,
       select strLotNo from inserted,
       --人从哪来?
       getdate()
end

#2


主健可更改最好不做主健,建一下唯一約束或索引

#3


如果是SQL2005用存儲過程

OUTPUT 子句 實現

#4


主健可更改,需要另一个不修改的唯一索引作为连接条件,否则最好不要用触发器了,在程序记录日志。

#5


create trgger tr_name on tblFiber
for update
as
begin    
    if Update(主键)
       insert into 记录表 select a.xx,b.xx ... from deleted a join inserted b on 条件
end

#6


create trigger updatePK
on tblFiber
after update
as
begin
if update(strLotNumber)
insert into tblFiberChanged
select a.strLotNumber,b.strLotnumber,CURRENT_USER,getdate()
from deleted a inner join inserted b on a.col2=b.col2 and a.col3=b.col3 and a.col4=b.col4 and .... --因为主键被修改了,所以要用其他能代表该行的列来对比.
end

#7


主键应该是很少更改的 经常用到的列。

#8



CREATE TRIGGER tr_tblFiber ON tblFiber
FOR UPDATE 
AS
IF @@ROWCOUNT>1 AND UPDATE(strLotNumber)
BEGIN
RAISERROR 50001N'多條更改'
ROLLBACK TRAN
RETURN
END
--以下自己加上列名
INSERT INTO tblFiberChanged
SELECT d.strLotNumber AS strLotNoOLD,i.strLotNumber AS strLotNoNew 
FROM INSERTED AS i,DELETED d

#9


先谢谢大家!
strLotNumber 应该是不可以重复的。这个不是用来连接用的。我的连接是用另外一个ID字段。

#10


在程序中测试过,可以了。
谢谢roy_88,也谢谢大家!
CREATE TRIGGER [trgLotNoChangeLog] ON [dbo].[tblFiber]
FOR UPDATE 
AS 
IF @@ROWCOUNT>1 AND UPDATE(strLotNumber)
BEGIN
    RAISERROR 50001N'多條更改'
    ROLLBACK TRAN
    RETURN
END
--以下自己加上列名
INSERT INTO tblFiberChanged 
SELECT d.strLotNumber AS strLotNoOLD,i.strLotNumber AS strLotNoNEW,i.lngModifiedUserID,GetDate() 
FROM INSERTED AS i,DELETED AS d

刚刚去学习触发器的相关内容:http://blog.csdn.net/a9529lty/article/details/6134226