什么是触发器?
发布网友
发布时间:2022-04-23 01:06
我来回答
共5个回答
懂视网
时间:2022-04-11 07:46
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
此外触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息等。
1、
中文名:触发器外文名:trigger简 介:与表事件相关的特殊的存储过程常规类型:DML 触发器、DDL 触发器等
目录
- 1 触发器的作用
- 2 分类
- ? DML触发器
- ? DDL触发器
- ? 登录触发器
- 3 SQL语法
- 4 优点
- 5 触发器和约束
- 6 慎用触发器
- 7 Sqlserver示例
- ? insert
- ? update
- ? delete
2、
1、
触发器的作用
触发器有如下作用:
可在写入数据表前,强制检验或转换数据。
触发器发生错误时,异动的结果会被撤销。
部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
可依照特定的情况,替换异动的指令 (INSTEAD OF)。
分类
[1] SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。
(在逻辑电路中根据逻辑功能不同,可分为RS触发器,D触发器,同步触发器等)
DML触发器
当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
DDL触发器
它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。
登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
SQL语法
DELIMITER |
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo代表该表的所有者
FOR EACH ROW
BEGIN
--do something
END |
优点
触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
触发器和约束
约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性(RI) 则应通过 FOREIGN KEY 约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。
例如:除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。
CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。
触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。
如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。
触发器到底可不可以在视图上创建 在 SQL Server™ 联机丛书中,是没有说触发器不能在视图上创建的, 并且在语法解释中表明:在 CREATE TRIGGER 的 ON 之后可以是视图。 然而,事实似乎并不是如此,很多专家也说触发器不能在视图上创建。我也专门作了测试,的确如此,不管是普通视图还是索引视图,都无法在上面创建触发器,真的是这样吗?
但是无可厚非的是:当在临时表或系统表上创建触发器时会遭到拒绝。
深刻理解 FOR CREATE TRIGGER 语句的 FOR 关键字之后可以跟 INSERT、UPDATE、DELETE 中的一个或多个,也就是说在其它情况下是不会触发触发器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。
相关内容 一个有趣的应用我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果直接打开数据库表进行更改,同样可以更改其用户名, 在触发器中利用回滚就可以巧妙地实现无法更改用户名……详细内容 触发器内部语句出错时…… 这种情况下,前面对数据更改操作将会无效。举个例子,在表中插入数据时触发触发器,而触发器内部此时发生了运行时错误,那么将返回一个错误值,并且拒绝刚才的数据插入。不能在触发器中使用的语句 触发器中可以使用大多数 T-SQL 语句,但如下一些语句是不能在触发器中使用的。
CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
DISK 语句,如:DISK INIT、DISK RESIZE。
LOAD 语句,如:LOAD DATABASE、LOAD LOG。
RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。
RECONFIGURE
TRUNCATE TABLE 语句在sybase的触发器中不可使用!
慎用触发器
触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
Sqlserver示例
insert
create trigger tri_insert
on student
for insert
as
declare @student_idchar(10)
select @student_id=s.student_id from students
inner join insertedion s.student_id=i.student_id
if @student_id=‘0000000001‘
begin
raiserror(‘不能插入1的学号!‘,16,8)
rollbacktran
end
go
update
create trigger tri_update
on student
for update
as
if update(student_id)
begin
raiserror(‘学号不能修改!‘,16,8)
rollbacktran
end
go
delete
create trigger tri_delete
on student
for delete
as
declare @student_idvarchar(10)
select @student_id=student_id from deleted
if @student_id=‘admin‘
begin
raiserror(‘错误‘,16,8)
rollbacktran
end
2、
1、
https://baike.baidu.com/item/%E8%A7%A6%E5%8F%91%E5%99%A8/16782
2、
|
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
|
DB-触发器:百科
标签:lock restore admin check 信息 阶段 http alter emma
热心网友
时间:2022-04-11 04:54
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强*从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。
扩展资料
触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。
与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
参考资料:百度百科-触发器
热心网友
时间:2022-04-11 06:12
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,是一种特殊类型的存储过程,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。
扩展资料:
触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。
例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
参考资料:
百度百科触发器
热心网友
时间:2022-04-11 07:46
触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。
它被定义为在对表或视图发出 UPDATE、INSERT 或 DELETE 语句时自动执行,在有数据修改时自动强制执行其业务规则。
触发器可以扩展 SQL Server 约束、默认值和规则的完整性检查逻辑,但只要约束和默认值提供了全部所需的功能,就应使用约束和默认值。
*/
-- 触发器的特点
/*
与表相关联
触发器定义在特定的表上,这个表称为触发器表。
自动激活触发器
当对表中的数据执行 INSERT、UPDATE 或 DELETE 操作时,如果对表上的这个特定操作定义了触发器,该触发器自动执行,这是不可撤销的。
不能直接调用
与存储过程不同,触发器不能被直接调用,也不能传递或接受参数。
作为事务的一部分
触发器与激活触发器的语句一起做为对一个单一的事务来对待,可以从触发器中的任何位置回滚。
当使用触发器时,应该考虑以下事实和知道原则:
即使不存在显式的 BEGIN TRANSACTION 语句,在触发器的定义中也可以包括 ROLLBACK TRANSACTION 语句
如果遇到一个 ROLLBACK TRANSACTION 语句,则整个事务回滚。如果在触发器脚本中跟随在 ROLLBACK TRANSACTION 语句后还有别的语句,
这些语句将继续被执行。需要的话,可以使用 RETURN 语句来防止这些语句的执行。
如果包括 ROLLBACK TRANSACTION 语句的触发器在一个用户定义的事务中被激活,这个 ROLLBACK TRANSACTION 语句撤销整个事务。
在这个用户定义的事务的批处理语句中,激活该触发器的语句之后的语句将不再执行。
*/
-- 举例
/*
use Test
GO
create table dbo.t_record(idx int identity(1,1),col_1 varchar(20))
insert t_record (col_1) values ('Row 01')
insert t_record (col_1) values ('Row 02')
insert t_record (col_1) values ('Row 03')
*/
create trigger tr_record_delete on dbo.t_record
for delete
as
/*
作用:当删除表 t_record 中的记录时,若一次删除 1 条以上,则取消删除
*/
if (select count(*) from deleted)>1
begin
raiserror('You cannot delete more than one record at a time',16,1)
rollback tran
end
Go
select * from t_record
delete t_record
select * from t_record
delete t_record where idx=1
-- 触发器的使用
/*
触发器最好用于保持低级的数据完整性,而不是返回查询结果。
触发器的主要好处是可以包含负责的处理逻辑。
触发器能对数据库中相关的表进行级联修改,强制比 CHECK 约束更复杂的数据完整性。与 CHECK 约束不同,触发器可以引用其他表中的列。
定义自定义的错误信息。
维护非规范化数据。级联是指保持主键与外键之间的关系,非规范化数据是指派生的,冗余的数据值。
比较修改前后数据的状态。绝大多数触发器提供了访问由 INSERT、UPDATE 或 DELETE 语句引起的数据变化前后状态的能力。
这样,就允许在触发器中引用由修改语句所影响的行。
*/
-- 使用触发器时的考虑
/*
触发器是后反应的(Reactive),约束是前反应的(Proactice)
在触发器定义的表中执行 DML 语句后,触发器执行。而约束是在 DML 语句执行前进行检查。
首先检查约束
如果在触发器表上存在约束,则约束在触发器之前进行检查。如果违反约束,触发器就不执行。
表对任何动作可以有多个触发器
允许在一个表上嵌套几个触发器。一个表可以定义多个触发器,每个触发器可以为一个或多个动作定义。
表的所有者能够指定最先和最后触发的触发器
当一个表上有多个触发器时,表的拥有者可以使用 sp_settriggerorder 系统存储过程来指定最先和最后激活的触发器。
其余的触发器的顺序不能被设置。
用户必须具有执行触发器定义的所有语句的权限
触发器创建者必须拥有在所有受影响的表上执行触发器所定义的所有语句的权限。
如果触发器中的任何部分的 T-SQL 语句的权限被拒绝,整个事务将被回滚。
表的属主不能在视图或临时表上创建 AFTER 触发器,但是触发器可以引用视图和临时表。
*/
-- 8.2 --------------------------------------------------
-- 定义触发器
-- 创建触发器
-- 创建时须定义 触发器的名称、触发器所在的表、触发器所监视的动作
CREATE TRIGGER trigger_name
ON table_name
FOR INSERT|UPDATE|DELETE
AS
......
GO
/*
模拟一个排队取号系统,当号码到达 50 之后,重新回到 1 开始计数。
即表中的 idx 到达 50 后,把表情空,把 IDENTITY 种子设置为 1 。
use Test
Go
create table t_queue(idx int identity(1,1),create_time datetime default(getdate()))
*/
create trigger tr_reset_queue on t_queue
for insert
as
if @@identity>50
begin
truncate table t_queue
declare @now datetime
set @now=getdate()
insert t_queue (create_time) values (@now)
end
Go
declare @now datetime
set @now=getdate()
insert t_queue (create_time) values (@now)
select * from t_queue order by idx desc
-- 修改触发器: 加密触发器、禁用触发器
-- 加密触发器
alter trigger tr_reset_queue on t_queue
with encryption
for insert
as
if @@identity>100
begin
truncate table t_queue
declare @now datetime
set @now=getdate()
insert t_queue (create_time) values (@now)
end
Go
sp_helptext tr_reset_queue
-- 禁用触发器
alter table t_queue
disable trigger tr_reset_queue
alter table t_queue
disable trigger all
-- 启用触发器
alter table t_queue
enable trigger tr_reset_queue
-- 删除触发器
-- 可以直接删除触发器,也可以通过删除触发器所在的表来删除触发器。
drop trigger tr_reset_queue
或者
drop table t_queue
-- 练习 --------------------------------------------------
-- 1 在 11 人制足球比赛中,球员在严重犯规后可被罚下场。
-- 但是当场上一个球队中的球员被罚到只剩 7 人时,无论再怎么犯规,都不能被罚下场。
/*
use Test
Go
create table dbo.t_RealMadrid_On(Name varchar(50),Num tinyint,Position char(3))
insert t_RealMadrid_On values ('Casillas',1,'GK')
insert t_RealMadrid_On values ('Salgado',2,'RB')
insert t_RealMadrid_On values ('Samuel',19,'CBT')
insert t_RealMadrid_On values ('Pavon',22,'CBT')
insert t_RealMadrid_On values ('Roberto Carlos',3,'LB')
insert t_RealMadrid_On values ('Figo',10,'RMF')
insert t_RealMadrid_On values ('Backham',23,'CMF')
insert t_RealMadrid_On values ('Ivan Helguera',6,'DMF')
insert t_RealMadrid_On values ('Zidane',5,'OMF')
insert t_RealMadrid_On values ('Ronaldo',9,'CF')
insert t_RealMadrid_On values ('Raul',7,'CF')
select * from t_RealMadrid_On
*/
-- 答案 --------------------------------------------------
-- 1
create trigger tr_player_delete
on t_RealMadrid_On
for delete
as
if (select count(*) from t_RealMadrid_On)<7
begin
rollback tran
raiserror('At Least 7 Players should Be On',16,1)
end
GO
delete t_RealMadrid_On where Num in (select max(Num) from t_RealMadrid_On)
select * from t_RealMadrid_On
-- 2 使用触发器完成以下功能:当删除 t_Proct 表时,检查 t_OrderHist
-- 中是否包含该产品的订购记录,如果没有,可以删除产品,否则回滚并报错。
use Test
Go
create table dbo.t_Proct(p_id int,p_name varchar(50),stock int)
insert t_Proct select 1,'SONY CD-R 52X',25
insert t_Proct select 2,'SONY DVD+R 16X',0
insert t_Proct select 3,'SONY DVD+R 8X',20
insert t_Proct select 4,'MITSUBISHI DVD+R 16X',10
Go
create table dbo.t_OrderHist(o_id int,p_id int,quantity int,orderdate smalldatetime default(getdate()))
insert t_OrderHist (o_id,p_id,quantity) select 10522,10,7
insert t_OrderHist (o_id,p_id,quantity) select 10523,2,9
insert t_OrderHist (o_id,p_id,quantity) select 10522,41,24
insert t_OrderHist (o_id,p_id,quantity) select 10522,7,5
GO
select * from t_Proct
select * from t_OrderHist
create trigger tr_proct_delete
on t_Proct
for delete
as
declare @p_id int
select @p_id = p_id from deleted
if @p_id in (select p_id from t_OrderHist )
begin
raiserror('t_OrderHist中是否包含该产品的订购记录不允许删除',16,1)
rollback tran
end
GO
热心网友
时间:2022-04-11 09:38
可以比照我们声控开关,当声音达到一定的程度,灯就会亮。数据库中的触发器就是当你执行了某一个动作比如insert,update,或delete某一个表,就会执行你定义好的sql语句。只是在数据库中,sql语句的执行也分before和after,而不像声控开关只是当声音到了之后才亮,触发器可以在你向某个表执行操作前执行