create trigger tri_insert on tableA for insert as begin insert tableB select * from insertedend
跟前面的回答一样,不能满足要求啊 现在把问题具体化一下: 创建两张表A、B如下create table A ( a int primary key ) go create table B ( b int , c nchar(50) not null, foreign key(b) references A(a) ) go在向A表插入一个记录的时候必须向B表也插入一个相应的操作记录,B表中的"c"为操作理由,需要手动输入,怎样设A表或B表的"INSERT"触发器或事务满足这个要求?
貌似我说这个不行已经好几次了,但是还是很多人回这个,是不是我的写法错误啊,SQL语句和结果如下:create trigger trg_a2b on A for insert as begin insert into B select * from INSERTED end 结果如下: create trigger trg_a2b on A for insert as begin insert into B select * from INSERTED end
create trigger tri_insert on tableA for insert as begin insert tableB select * from insertedend
create table A ( a int primary key ) go create table B ( b int , c nchar(50) not null, foreign key(b) references A(a) ) go在向A表插入一个记录的时候必须向B表也插入一个相应的操作记录,B表中的"c"为操作理由,需要手动输入,怎样设A表或B表的"INSERT"触发器或事务满足这个要求?写个存储过程create proc myprocedure (@a int,@b int,@c nchar(50)) as begin tran insert into A (a) values (@a) if @@error>0 begin rollback tran return end insert into B (b,c) values(@b,@c) if @@error>0 rollback tran else commit tran go
create trigger trg_a2b on a for insert as
begin
insert into b select * from deleted
end
create trigger trg_a2b on a for insert as
begin
insert into b select * from INSERTED
end
B表中的主码需要手动输入,怎样设A表的插入触发器满足这个要求?
b中的主碼要手工輸入,那就你查詢出插入的值然後再更新一次啦!
因為要手工輸入主碼--這點就證明触發器只能估一半工作
create trigger tri_insert on tableA
for insert
as
begin
insert tableB
select * from insertedend
如果b表插入时出错,直接roll back就可以了,dml语句同样被回滚。
create table t1(a int)
go
create table t2(b int)
go
create trigger t1_r on t1
for insert
as
begin
--commit
insert t2 select a*10000000 from insertedend
goinsert t1 select 1354
goselect * from t1
select * from t2
/*
均为空。说明t1,t2都未能插入数据。
除非显式在出错语句前提交. 去掉commit的注释后,才会看到t1有一行数据。
instead of,for,after之间有一些差异我就不再多说了,自己体会吧
*/
godrop table t1,t2
go
但是这样也有问题,就是只能通过视图向A表插入记录,要是不通过视图插入,还是会出现数据不一致的问题。
for insert
as
begin
insert tableB
select * from insertedend
跟前面的回答一样,不能满足要求啊
现在把问题具体化一下:
创建两张表A、B如下create table A
(
a int primary key
)
go
create table B
(
b int ,
c nchar(50) not null,
foreign key(b) references A(a)
)
go在向A表插入一个记录的时候必须向B表也插入一个相应的操作记录,B表中的"c"为操作理由,需要手动输入,怎样设A表或B表的"INSERT"触发器或事务满足这个要求?
貌似我说这个不行已经好几次了,但是还是很多人回这个,是不是我的写法错误啊,SQL语句和结果如下:create trigger trg_a2b on A for insert as
begin
insert into B select * from INSERTED
end 结果如下:
create trigger trg_a2b on A for insert as
begin
insert into B select * from INSERTED
end
消息 213,级别 16,状态 1,过程 trg_a2b,第 3 行
插入错误: 列名或所提供值的数目与表定义不匹配。
for insert
as
begin
insert tableB
select * from insertedend
(
a int primary key
)
go
create table B
(
b int ,
c nchar(50) not null,
foreign key(b) references A(a)
)
go在向A表插入一个记录的时候必须向B表也插入一个相应的操作记录,B表中的"c"为操作理由,需要手动输入,怎样设A表或B表的"INSERT"触发器或事务满足这个要求?写个存储过程create proc myprocedure
(@a int,@b int,@c nchar(50))
as
begin tran
insert into A (a) values (@a)
if @@error>0
begin
rollback tran
return
end
insert into B (b,c) values(@b,@c)
if @@error>0
rollback tran
else
commit tran
go
这样可以保证通过存储过程“myprocedure”向A表和B表同时插入记录
但是也有问题,就是只能通过存储过程向A表和B表插入记录,要是直接向A表或者B表插入记录的话是可以插入的,那样就会出现记录不一致的问题。
这个问题能否解决呢?
for insert
as
begin
insert tableB
select * from insertedend
可以
create trigger trg_a2b on a for insert as
begin
insert into b select * from INSERTED
end
begin
insert into b select * from INSERTED
end
写触发器
有没有对SQL有经验的啊,麻烦指导一下啊