数据库触发器问题

数据库触发器问题,第1张

SQLServer触发器创建、删除、修改、查看...

??本站整理??互联网??2010-06-26 ??点击:?17380???我要评论

一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。?

二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表。?

一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。?

二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。?

Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。?

Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。?

三:Instead of和After触发器?

SQL Server2000提供了两种触发器:Instead of和After触发器。这两种触发器的差别在于他们被激活的同:?

Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of触发器也可以用于视图﹐用来扩展视图可以支持的更新 *** 作。?

After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。?

一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of触发器﹐一个表的每个修改动作都可以有多个After触发器。?

四:触发器的执行过程?

如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束。?

Instead of触发器可以取代激发它的 *** 作来执行。它在Inserted表和Deleted表刚刚建立﹐其它任何 *** 作还没有发生时被执行。因为Instead of触发器在约束之前执行﹐所以它可以对约束进行一些预处理。?

五:使用T-SQL语句来创建触发器?

基本语句如下:?

create trigger trigger_name?

on {table_name view_name}?

{for After Instead of }?

[ insert, update,delete ]?

as?

sql_statement?

六:删除触发器:?

基本语句如下:?

drop trigger trigger_name?

七:查看数据库中已有触发器:?

--查看数据库已有触发器?

use jxcSoftware?

go?

select * from sysobjects where xtype='TR'?

--查看单个触发器?

exec sp_helptext '触发器名'?

八:修改触发器:?

基本语句如下:?

alter trigger trigger_name?

on {table_name view_name}?

{for After Instead of }?

[ insert, update,delete ]?

as?

sql_statement?

九:相关示例:?

1:在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。?

create trigger orderinsert?

on orders?

after insert?

as?

if (select status from goods,inserted?

where goods.name=inserted.goodsname)=1?

begin?

print 'the goods is being processed'?

print 'the order cannot be committed'?

rollback transaction --回滚﹐避免加入?

end?

2:在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录中的库存。?

create trigger orderinsert1?

on orders?

after insert?

as?

update goods set storage=storage-inserted.quantity?

from goods,inserted?

where?

goods.name=inserted.goodsname?

3:在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。?

create trigger goodsdelete?

on goods?

after delete?

as?

delete from orders?

where goodsname in?

(select name from deleted)?

4:在Orders表建立一个更新触发器﹐监视Orders表的订单日期(OrderDate)列﹐使其不能手工修改.?

create trigger orderdateupdate?

on orders?

after update?

as?

if update(orderdate)?

begin?

raiserror(' orderdate cannot be modified',10,1)?

rollback transaction?

end?

5:在Orders表建立一个插入触发器﹐保证向Orders表插入的货品名必须要在Goods表中一定存在。?

create trigger orderinsert3?

on orders?

after insert?

as?

if (select count(*) from goods,inserted wheregoods.name=inserted.goodsname)=0?

begin?

print ' no entry in goods for this order'?

rollback transaction?

end?

6:Orders表建立一个插入触发器,保证向Orders表插入的货品信息要在Order表中添加?

alter trigger addOrder?

on Orders?

for insert?

as?

insert into Order?

select inserted.Id, inserted.goodName,inserted.Numberfrom inserted

使用SQL触发器删除级联记录(1)

2010-09-01 16:40佚名CNBLOGS我要评论(0)字号:T|T

SQL触发器:当改变(增、删、改)数据表的记录时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。

AD:2013大数据全球技术峰会低价抢票中

下文将为您介绍使用SQL触发器来删除级联揭露的方法,并附相关实例,供您参考,希望对您有所帮助。

SQL触发器:当改变(增、删、改)数据表的记录时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。

比如,当我们删除新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记录,但是通过触发器,我们就可以实现。

delete from category where id=5 --sql删除语句

create trigger trigcategorydelete --当执行sql删除语句时,执行触发器

on category

after delete

as

begin

delete news where caId=(select id from deleted) --删除对应新闻类别的新闻内容

end

照一般的思维,这样就可以同时删除新闻类别和其下的新闻内容,但是这样执行却不成功。是因为关键字AFTER,AFTER表示在执行SQL删除语句后,再执行触发器里的语句。这样一来,顺序同样是先删除新闻再删除新闻内容,肯定不成功。

改变关键字after为instead of

使用SQL触发器删除级联记录(2)

2010-09-01 16:40佚名CNBLOGS我要评论(0)字号:T|T

SQL触发器:当改变(增、删、改)数据表的记录时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。

AD:2013大数据全球技术峰会低价抢票中

instead of,表示代替delete *** 作,而没有真正delete from category where id=5,当category表的删除时,同时触发了trigcategorydelete触发器,但是由于有instead of关键字,所以本身并不执行删除 *** 作,而是执行触发器里的sql语句,从而可以替代之前的SQL语句。比如:

create trigger trigcategorydelete

on category

instead of delete

as

begin

declare @id int --定义一个变量id

select @id=id from deleted --从deleted临时表中,赋值id给变量@id

delete news where caId=@id --先删除该类别下的所有新闻

delete category where id=@id --然后删除新闻类别

end

当我们执行delete from category where id=5时,id=5的类别并没有真正删除,而是转而执行触发器里面的SQL语句

关于deleted表:

Deleted表用于存储DELETE和UPDATE语句所影响的行的复本。在执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到deleted表中。Deleted表和触发器表通常没有相同的行。(//最后一句不是怎么明白啊?)by google

删除一条记录时候,他会把删除的这条记录放在一张临时表里,当你对category表进行删除时,在SQL返回的结果消息里面会提示出你删除的记录。

Deleted表用于存储DELETE和UPDATE语句所影响的行的复本。在执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到deleted表中。Deleted表和触发器表通常没有相同的行。(//最后一句不是怎么明白啊?)by google

删除一条记录时候,他会把删除的这条记录放在一张临时表里,当你对category表进行删除时,在SQL返回的结果消息里面会提示出你删除的记录。

8顶

SQLServer触发器创建、删除、修改、查看...

本站整理互联网 2010-06-26 点击:17433 我要评论

一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。

二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表。

一:触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。

二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个 表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。

Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。

Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。

三:Instead of和After触发器

SQL Server2000提供了两种触发器:Insteadof和After触发器。这两种触发器的差别在于他们被激活的同:

Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of触发器也可以用于视图﹐用来扩展视图可以支持的更新 *** 作。

After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。

一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of触发器﹐一个表的每个修改动作都可以有多个After触发器。

四:触发器的执行过程

如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束。

Instead of触发器可以取代激发它的 *** 作来执行。它在Inserted表和Deleted表刚刚建立﹐其它任何 *** 作还没有发生时被执行。因为Instead of触发器在约束之前执行﹐所以它可以对约束进行一些预处理。

五:使用T-SQL语句来创建触发器

基本语句如下:

create trigger trigger_name

on {table_name view_name}

{for After Instead of }

[ insert, update,delete ]

as

sql_statement

六:删除触发器:

基本语句如下:

drop trigger trigger_name

七:查看数据库中已有触发器:

--查看数据库已有触发器

use jxcSoftware

go

select * from sysobjects where xtype='TR'

--查看单个触发器

exec sp_helptext '触发器名'

八:修改触发器:

基本语句如下:

alter trigger trigger_name

on {table_name view_name}

{for After Instead of }

[ insert, update,delete ]

as

sql_statement

九:相关示例:

1:在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。

create trigger orderinsert

on orders

after insert

as

if (select status from goods,inserted

where goods.name=inserted.goodsname)=1

begin

print 'the goods is being processed'

print 'the order cannot be committed'

rollback transaction --回滚﹐避免加入

end

2:在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录中的库存。

create trigger orderinsert1

on orders

after insert

as

update goods set storage=storage-inserted.quantity

from goods,inserted

where

goods.name=inserted.goodsname

3:在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。

create trigger goodsdelete

on goods

after delete

as

delete from orders

where goodsname in

(select name from deleted)

4:在Orders表建立一个更新触发器﹐监视Orders表的订单日期(OrderDate)列﹐使其不能手工修改.

create trigger orderdateupdate

on orders

after update

as

if update(orderdate)

begin

raiserror(' orderdate cannot be modified',10,1)

rollback transaction

end

5:在Orders表建立一个插入触发器﹐保证向Orders表插入的货品名必须要在Goods表中一定存在。

create trigger orderinsert3

on orders

after insert

as

if (select count(*) from goods,inserted where goods.name=inserted.goodsname)=0

begin

print ' no entry in goods for this order'

rollback transaction

end

6:Orders表建立一个插入触发器,保证向Orders表插入的货品信息要在Order表中添加

alter trigger addOrder

on Orders

for insert

as

insert into Order

select inserted.Id, inserted.goodName,inserted.Number from inserted

在sqlserver中inserted和deleted都是虚表,当对一张表进行插入 *** 作(insert)时就会产生inserted虚表,里面存放的是新插入表中的记录的副本;当对一张表进行修改 *** 作(update)时会产生inserted和deleted两个虚表,inserted里存放的是修改后新的记录,deleted存放的是修改前老的记录;当对一张表进行删除 *** 作(delete)时会产生deleted表,里面存放的是删除掉的记录。

begin和end是配对的,有begin一定要有end与之对应,begin和end相当于块,把语句封装在块里,稳定,可读性好,而且便于事务的回滚 *** 作。有问题再追问吧,望采纳。

简单的给你解释下吧

在delete数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted

而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。

更新 *** 作可以认为是执行了两个 *** 作,先把那一行记录delete掉,然后再insert,这样update *** 作实际上就对deleted表和inserted表的 *** 作,所以不会有updated表了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6773109.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-28
下一篇2023-03-28

发表评论

登录后才能评论

评论列表(0条)

    保存