主键: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 子句 實現
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
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字段。
strLotNumber 应该是不可以重复的。这个不是用来连接用的。我的连接是用另外一个ID字段。
#10
在程序中测试过,可以了。
谢谢roy_88,也谢谢大家!
刚刚去学习触发器的相关内容:http://blog.csdn.net/a9529lty/article/details/6134226
谢谢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 子句 實現
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
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字段。
strLotNumber 应该是不可以重复的。这个不是用来连接用的。我的连接是用另外一个ID字段。
#10
在程序中测试过,可以了。
谢谢roy_88,也谢谢大家!
刚刚去学习触发器的相关内容:http://blog.csdn.net/a9529lty/article/details/6134226
谢谢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