数据库触发器问题

利用CREATETRIGGER命令创建触发器tri_insert,当向学生成绩stu_grade表中插入某个学生的某门课程的成绩的时候,检查该学生不及格的课程的数量是否已... 利用CREATE TRIGGER命令创建触发器tri_insert,当向学生成绩stu_grade表中插入某个学生的某门课程的成绩的时候,检查该学生不及格的课程的数量是否已经达到4门,如果是,则把这个学生的信息插入到退学学生信息表stu_info2中,stu_info2表的结构和stu_info表的结构相同; 展开
 我来答
PythonV8
2013-05-13
知道答主
回答量:9
采纳率:0%
帮助的人:6万
展开全部
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
jkhebing
2013-05-12 · 超过18用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:37.2万
展开全部
--成绩表的插入触发器
Create Trigger tri_insert ON stu_grade
for insert
AS
    set nocount on
    Insert into Stu_info2
        Select *
        From Stu_info B
        Where exists
        (
        Select 1 From stu_grade A,inserted I where A.学号=I.学号
        And A.学号 = B.学号
        And A.成绩< 60 Group by A.学号 having count(A.学号) > 4)
        )
    set nocount off


请参考 sql server 触发器,有问题进一步交流

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
晋修行玮奇
2019-07-20 · TA获得超过3778个赞
知道大有可为答主
回答量:3086
采纳率:32%
帮助的人:201万
展开全部
弱弱的问一句010应该不数字吧,字符的话是不能比较大小的,另外触发器是要有触发条件的(更新,删除,插入),“如果超过010”这个条件显然不是一个动作,貌似不能作为触发条件,貌似直接用一个简单UPDate语句就能完成,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式