数据库触发器问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库触发器问题相关的知识,希望对你有一定的参考价值。

利用CREATE TRIGGER命令创建触发器tri_insert,当向学生成绩stu_grade表中插入某个学生的某门课程的成绩的时候,检查该学生不及格的课程的数量是否已经达到4门,如果是,则把这个学生的信息插入到退学学生信息表stu_info2中,stu_info2表的结构和stu_info表的结构相同;

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
参考技术A --成绩表的插入触发器
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 触发器,有问题进一步交流

本回答被提问者和网友采纳
参考技术B 弱弱的问一句010应该不数字吧,字符的话是不能比较大小的,另外触发器是要有触发条件的(更新,删除,插入),“如果超过010”这个条件显然不是一个动作,貌似不能作为触发条件,貌似直接用一个简单UPDate语句就能完成,

MySQL 主从复制,仅在从数据库(Slave)上存在的触发器(Trigger)不会被触发的问题解决

今天遇到了数据库触发器不会被触发的问题。首先说一下背景:

主数据库的binlog_format为ROW,且不存在触发器SYN,安装在Windows10操作系统上

从数据库的binlog_format为ROW,从库上存在触发器SYN

触发器SYN 实现的目的是:当有一条新的记录被插入时,向同一个连接的 数据库X 更新最新消息(主从同步不涉及 数据库X )

本次问题的解决参考了以下文章:

MySQL Binlog 【ROW】和【STATEMENT】选择

mysql主从触发器的关系

mysql 主从 binlog_format_主从 binlog_format 设置关系

根据以上几篇文章,可以发现触发器未被触发的原因:

从数据库存在一个主数据库不存在的触发器SYN,而 binlog_format 为 ROW 模式时,不会再次触发从数据库触发器,因此问题的解决办法就是将主数据库的 binlog_format 设置为 STATEMENT 模式。以下为操作过程:

注:查看binlog_format 的命令为:

SHOW VARIABLES like 'binlog_format';

1.暂停主从复制

在从数据库上输入以下命令:

STOP SLAVE;

2.修改主数据库的配置文件

打开C:\\ProgramData\\MySQL\\MySQL Server 8.0路径下的my.ini文件

在log-bin下增加:

binlog_format="STATEMENT"

保存。(注意文件编码,详情可参考上一条博客)。

3.重启主数据库服务

在主数据库所在计算机的“服务”中,选中MySQL,选择重新启动。

4.重新开启主从复制

在从数据库上输入以下命令:

START SLAVE;

查询 数据库X 可以看到触发器已经正常工作。

以上是关于数据库触发器问题的主要内容,如果未能解决你的问题,请参考以下文章

一个关于SyBase 数据库 Insert 触发器的问题

Oracle数据库中有关触发器问题

Oracle数据库如何解决ORA-04091触发器/函数不能读它的问题

mysql添加触发器后无法插入数据的问题

有条件更新的数据库触发器问题

触发器和数据触发器有啥区别?