sql2005 触发器的问题
现在有两张表:a表,字段有a1,a2,a3b表,字段有b1,b2当向a表中添加一行新的数据时,用触发器自动把相同内容写入b表要求b1=a1,b2=a2*a3咋整?我查了半...
现在有两张表:
a表,字段有a1,a2,a3
b表,字段有b1,b2
当向a表中添加一行新的数据时,用触发器自动把相同内容写入b表
要求b1=a1,b2=a2*a3
咋整?
我查了半天书,就有一个问题,怎么让触发器知道我要它写入b表的是刚刚输入的数据,而不是其他的 展开
a表,字段有a1,a2,a3
b表,字段有b1,b2
当向a表中添加一行新的数据时,用触发器自动把相同内容写入b表
要求b1=a1,b2=a2*a3
咋整?
我查了半天书,就有一个问题,怎么让触发器知道我要它写入b表的是刚刚输入的数据,而不是其他的 展开
5个回答
展开全部
仔细看看下面关于触发器的说明,相信你自己就能作出来了
<一>触发器是一种特殊类型的存储过程。存储过程是通过存储过程名被调用执行的,而触发器主要是通过事件触发而被执行的。
<二>触发器可通过数据库中的相关表实现级联更改。如果触发器表存在约束,则在instead of 触发器执行后after触发器执行前检查这些约束,如果约束破坏,则回滚instead of触发器操作并不执行after触发器.
<三>SQL Server为每个触发器都创建两个专用表:inserted表和deleted表。这两个表是逻辑表,不能修改,其表结构与被触发器作用的表的结构相同。触发器执行完毕后,与该触发器相关的这两个表会自动删除,
<三>当执行insert语句时,inserted表存放要向表中插入的所有行.
当执行delete语句时,deleted表存放要从表中删除的所有行。
当执行update语句时,相当于先执行一个delete操作,再执行一个insert操作。因此,老行首先移到deleted表中,新行插入激活触发器的表和inserted表。
<四>创建触发器格式:
create trigger trigger_name
on table|view
with encryption
for/after/instead of{[insert][,][update][,][delete]}
not for replication
as
if update/insert
sql statement
go
说明:trigger_name:触发器的名字
table/view:执行触发器的表
with encrytion:加密
for/after(后触发):for与after同义,指定触发器只有在触发触发器的SQL语句中指定的所有操作都成功完成后才激发。所有的引用级联操作和约束必须成功后才能执行该触发器。
instead of(替代触发):执行触发器,而不执行触发触发器的SQL语句。在表或视图上,每个insert、delete、update语句只能定义一个instead of触发器
[insert][,][update][,][delete]:在表或视图上执行哪些数据修改语句时将激活触发器。必须指定一个选项。
[not for replication]:当复制进程更改触发器所涉及的表时,不执行触发器。
<五>触发器的分类:
按照激发触发过程执行的SQL语句不同可以分为:insert触发、delete触发和update触发
按照是否执行触发的SQL语句可以分为后触发(for/after)和替代触发(instead of)
for/after(后触发):只有在激发触发过程执行的SQL语句执行完毕后,才执行触发过程体
instead of(替代触发):只执行触发过程,不执行SQL语句
修改触发器:alter trigger
例2 将例1创建的触发器中For Update修改为Instead Of Update并进行比较。
Alter trigger test1
On 销售人员
Instead of update
As
Print ‘记录没有修改!’
--测试
UPDATE 销售人员 SET 性别=‘女’ WHERE 工号=3
比较:用Instead Of时执行触发器,而不执行触发触发器的SQL语句。
<六>例1 创建一后触发器,要求每当在销售人员表中修改数据时,将向客户端显示一条消息“记录已修改!”
--创建触发器
USE market
GO
CREATE TRIGGER Test1
ON 销售人员
FOR UPDATE
AS
PRINT '记录已修改!'
GO
--测试
UPDATE 销售人员 SET 性别=‘女’ WHERE 工号=1
<七>insert 触发器
• 例1:在订单信息表上建立后触发的插入触发器,当用户插入新的订单时,如果订货量大于货品信息表上的库存量,则不能实现插入操作,并给出提示信息
create trigger check_储存量
on 订单信息
for insert
as
declare @goodno int,@ordernum int,@stored int
select @goodno=货品编码,@ordernum=数量 from inserted
select @stored=库存量 from 货品信息 where 编码=@goodno
if @stored<@ordernum
begin
raiserror('订货量超出库存量,不能进行订货!',7,1)
rollback transaction
end
go
<一>触发器是一种特殊类型的存储过程。存储过程是通过存储过程名被调用执行的,而触发器主要是通过事件触发而被执行的。
<二>触发器可通过数据库中的相关表实现级联更改。如果触发器表存在约束,则在instead of 触发器执行后after触发器执行前检查这些约束,如果约束破坏,则回滚instead of触发器操作并不执行after触发器.
<三>SQL Server为每个触发器都创建两个专用表:inserted表和deleted表。这两个表是逻辑表,不能修改,其表结构与被触发器作用的表的结构相同。触发器执行完毕后,与该触发器相关的这两个表会自动删除,
<三>当执行insert语句时,inserted表存放要向表中插入的所有行.
当执行delete语句时,deleted表存放要从表中删除的所有行。
当执行update语句时,相当于先执行一个delete操作,再执行一个insert操作。因此,老行首先移到deleted表中,新行插入激活触发器的表和inserted表。
<四>创建触发器格式:
create trigger trigger_name
on table|view
with encryption
for/after/instead of{[insert][,][update][,][delete]}
not for replication
as
if update/insert
sql statement
go
说明:trigger_name:触发器的名字
table/view:执行触发器的表
with encrytion:加密
for/after(后触发):for与after同义,指定触发器只有在触发触发器的SQL语句中指定的所有操作都成功完成后才激发。所有的引用级联操作和约束必须成功后才能执行该触发器。
instead of(替代触发):执行触发器,而不执行触发触发器的SQL语句。在表或视图上,每个insert、delete、update语句只能定义一个instead of触发器
[insert][,][update][,][delete]:在表或视图上执行哪些数据修改语句时将激活触发器。必须指定一个选项。
[not for replication]:当复制进程更改触发器所涉及的表时,不执行触发器。
<五>触发器的分类:
按照激发触发过程执行的SQL语句不同可以分为:insert触发、delete触发和update触发
按照是否执行触发的SQL语句可以分为后触发(for/after)和替代触发(instead of)
for/after(后触发):只有在激发触发过程执行的SQL语句执行完毕后,才执行触发过程体
instead of(替代触发):只执行触发过程,不执行SQL语句
修改触发器:alter trigger
例2 将例1创建的触发器中For Update修改为Instead Of Update并进行比较。
Alter trigger test1
On 销售人员
Instead of update
As
Print ‘记录没有修改!’
--测试
UPDATE 销售人员 SET 性别=‘女’ WHERE 工号=3
比较:用Instead Of时执行触发器,而不执行触发触发器的SQL语句。
<六>例1 创建一后触发器,要求每当在销售人员表中修改数据时,将向客户端显示一条消息“记录已修改!”
--创建触发器
USE market
GO
CREATE TRIGGER Test1
ON 销售人员
FOR UPDATE
AS
PRINT '记录已修改!'
GO
--测试
UPDATE 销售人员 SET 性别=‘女’ WHERE 工号=1
<七>insert 触发器
• 例1:在订单信息表上建立后触发的插入触发器,当用户插入新的订单时,如果订货量大于货品信息表上的库存量,则不能实现插入操作,并给出提示信息
create trigger check_储存量
on 订单信息
for insert
as
declare @goodno int,@ordernum int,@stored int
select @goodno=货品编码,@ordernum=数量 from inserted
select @stored=库存量 from 货品信息 where 编码=@goodno
if @stored<@ordernum
begin
raiserror('订货量超出库存量,不能进行订货!',7,1)
rollback transaction
end
go
展开全部
请看下面的说明:
1、在delete数据的时候,数据库将要删除的数据放到一个叫deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted。
2、insert的时候是把要插入的数据放在inserted表中。
3、更新操作可以认为是执行了两个操作,先那一行记录delete掉,然后再insert,这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了。
因此你只需要从 inserted 表中查询数据,并把这条数据按照你的要求插入b表就可以了。
---
以上,希望对你有所帮助。
1、在delete数据的时候,数据库将要删除的数据放到一个叫deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted。
2、insert的时候是把要插入的数据放在inserted表中。
3、更新操作可以认为是执行了两个操作,先那一行记录delete掉,然后再insert,这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了。
因此你只需要从 inserted 表中查询数据,并把这条数据按照你的要求插入b表就可以了。
---
以上,希望对你有所帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
自己看看触发器再整,求人不如求己
写给你了,注意a表的a2、a3字段要为数字型 以为这里用了a2*a3
用法,新建查新,拷贝下面的运行就ok了
CREATE TRIGGER tr_Table1_Insert ON a
for insert
as
begin
INSERT b select a1,a2*a3 from a
end
写给你了,注意a表的a2、a3字段要为数字型 以为这里用了a2*a3
用法,新建查新,拷贝下面的运行就ok了
CREATE TRIGGER tr_Table1_Insert ON a
for insert
as
begin
INSERT b select a1,a2*a3 from a
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CREATE TRIGGER tr_Insert_b ON a
for insert
as
begin
declare @a1 int,@a2 int,@a3 int --假设a1,a2,a3都为int
select @a1=a.a1,@a2=a.a2,@a3=a.a3
from a,inserted
where a.a1=inserted.a1 and a.a2=inserted.a2 and a.a3=inserted.a3
--因为不知道主键
insert into b values(@a1,@a2*@a3)
end
for insert
as
begin
declare @a1 int,@a2 int,@a3 int --假设a1,a2,a3都为int
select @a1=a.a1,@a2=a.a2,@a3=a.a3
from a,inserted
where a.a1=inserted.a1 and a.a2=inserted.a2 and a.a3=inserted.a3
--因为不知道主键
insert into b values(@a1,@a2*@a3)
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Create Trigger A_Insert On A For Insert As
Begin
Declare @la1,@la2,la3 integer
Insert Into b (b1,b2) Select a1,a2*a3 From Inserted
End
Begin
Declare @la1,@la2,la3 integer
Insert Into b (b1,b2) Select a1,a2*a3 From Inserted
End
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询