如何在触发器使用insert语句

assky124 2010-05-25 12:40:05
有两个表

tableA --数据表
tableB --监视表,用于监视tableA中数据的插入、修改操作

每当tableA中插入数据或者修改数据时,就在tableB中插入1条记录

create trigger trig_A_Upd
ON tableA
FOR INSERT
INSERT INTO tableB something

插入的触发器成功,可以正确触发,不过 当我把 FOR INSERT 改成FOR UPDATE时就不能更改,老提示不能唯一,改变了多行(2行)
...全文
281 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
htl258_Tony 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
SQL code
create trigger tri_tableA_insert_update
on tableA
for insert,update
as
begin
insert into tableB select * from inserted
end
[/Quote]我看是这个意思
永生天地 2010-05-25
  • 打赏
  • 举报
回复
something is what thing?
百年树人 2010-05-25
  • 打赏
  • 举报
回复
create trigger tri_tableA_insert_update
on tableA
for insert,update
as
begin
insert into tableB select * from inserted
end
永生天地 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 assky124 的回复:]
搞了半天是在检索的时候用了



SQL code

SELECT @Price = dj FROM Inserted
--Select @PrePrice = dj FROM Deleted 注释掉就可以了0


inserted表和deleted表不能同时使用?
[/Quote]

你的代码究竟怎么写的,inserted和deleted可以同时用 ,判断是否修改用
assky124 2010-05-25
  • 打赏
  • 举报
回复
搞了半天是在检索的时候用了



SELECT @Price = dj FROM Inserted
--Select @PrePrice = dj FROM Deleted 注释掉就可以了0

inserted表和deleted表不能同时使用?
永生天地 2010-05-25
  • 打赏
  • 举报
回复
可是我按照你的说法做,都没问题,不知道你的具体操作是什么?

看看这三个执行

CREATE TABLE TABLEA(ID INT PRIMARY KEY,NAME VARCHAR(10))
CREATE TABLE TABLEB(ID INT IDENTITY(1,1) PRIMARY KEY,NAME VARCHAR(10))
create trigger trig_A_Upd
ON tableA
FOR INSERT,UPDATE
AS
insert into tableB(NAME)Values(1)

--执行1
INSERT TABLEA VALUES(1,'1')
SELECT * FROM TABLEB
/*ID NAME
----------- ----------
1 1

(所影响的行数为 1 行)

*/

--执行2
INSERT TABLEA VALUES(2,'2')
SELECT * FROM TABLEB
/*
ID NAME
----------- ----------
1 1
2 1

(所影响的行数为 2 行)

*/

--执行3
UPDATE TABLEA SET NAME='1'
SELECT * FROM TABLEA
/*ID NAME
----------- ----------
1 1
2 1

(所影响的行数为 2 行)

*/
SELECT * FROM TABLEB
/*ID NAME
----------- ----------
1 1
2 1
3 1

(所影响的行数为 3 行)
*/



[Quote=引用 5 楼 assky124 的回复:]
1楼的不行,早试过了

something 简单的比如:insert into tableB(column1)Values(1)(这个在Insert触发器中可以执行,将Insert触发器移除也不能执行,应该不是那个干扰)。
我想是不是Update是个二元触发(delete和Insert),网上能找到的只是简单的有效性判断,不符合回滚什么的。
如果Update触发器中不能使用Insert语句……
[/Quote]
assky124 2010-05-25
  • 打赏
  • 举报
回复
1楼的不行,早试过了

something 简单的比如:insert into tableB(column1)Values(1)(这个在Insert触发器中可以执行,将Insert触发器移除也不能执行,应该不是那个干扰)。
我想是不是Update是个二元触发(delete和Insert),网上能找到的只是简单的有效性判断,不符合回滚什么的。
如果Update触发器中不能使用Insert语句的话,是否有其他方式实现该功能呢?
dawugui 2010-05-25
  • 打赏
  • 举报
回复
--我认为可能需要这样,首先对表tableb建里一个自增字段,以区别重复问题,然后需要设置一个标记字段,以记录是删除、插入、更改三种中的一种。
--大致为:
create trigger my_trig on tableA for insert ,update ,delete
as
if not exists(select 1 from inserted)
insert into tableB(除了自增列的其他字段) select * , '删除' from deleted
else if not exists(select 1 from deleted)
insert into tableB(除了自增列的其他字段) select * , '插入' from inserted
else
insert into tableB(除了自增列的其他字段) select * , '更改' from inserted
go

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧