sql server触发器,SQL SERVER数据库触发器的使用
sql server触发器,SQL SERVER数据库触发器的使用详细介绍
本文目录一览: SQLSERVER中触发器的触发类型有几种?
SQL SERVER中触发器的触发类型有三种。
1、DML触发器,当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果对该表写了对应的DML触发器,那么该触发器自动执行。
2、DDL触发器,是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改。
3、登录触发器,登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。
扩展资料:
DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
来自登录触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
触发器可在写入数据表前,强制检验或转换数据。触发器发生错误时,异动的结果会被撤销。可依照特定的情况,替换异动的指令 (INSTEAD OF)。
SQL中触发器有什么作用
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。\x0d\x0a 触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。\x0d\x0a 触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。\x0d\x0a触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。\x0d\x0a SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。\x0d\x0a 语法为:\x0d\x0a CREATE TRIGGER ``.``\x0d\x0a \x0d\x0a ON [dbo] //dbo代表该表的所有者\x0d\x0a FOR EACH ROW\x0d\x0a BEGIN\x0d\x0a --do something\x0d\x0a END\x0d\x0a 触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。\x0d\x0a 约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性(RI) 则应通过 FOREIGN KEY 约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。\x0d\x0a CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。\x0d\x0a 触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。\x0d\x0a 如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。\x0d\x0a实例1:insert触发器\x0d\x0acreate trigger tri_insert\x0d\x0aon student\x0d\x0afor insert\x0d\x0aas\x0d\x0adeclare @student_id char(10)\x0d\x0aselect @student_id=s.student_id from\x0d\x0astudent s inner join inserted i\x0d\x0aon s.student_id=i.student_id\x0d\x0aif @student_id='0000000001'\x0d\x0abegin\x0d\x0araiserror('不能插入1的学号!',16,8)\x0d\x0arollback tran\x0d\x0aend\x0d\x0ago\x0d\x0a实例2:update触发器\x0d\x0acreate trigger tri_update\x0d\x0aon student\x0d\x0afor update\x0d\x0aas\x0d\x0aif update(student_id)\x0d\x0abegin\x0d\x0araiserror('学号不能修改!',16,8)\x0d\x0arollback tran\x0d\x0aend\x0d\x0ago\x0d\x0a实例3:delete触发器示\x0d\x0acreate trigger tri_delete\x0d\x0aon student\x0d\x0afor delete\x0d\x0aas\x0d\x0adeclare @student_id varchar(10)\x0d\x0aselect @student_id=student_id from deleted\x0d\x0aif @student_id='admin'\x0d\x0abegin\x0d\x0araiserror('错误',16,8)\x0d\x0arollback tran\x0d\x0aend
SQL server中有哪几种触发器?
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
解析:
触发器的概念及作用
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束。
(2) 跟踪变化Auditing changes
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3) 级联运行(Cascaded operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4) 存储过程的调用(Stored procedure invocation)。
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
触发器的种类
SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。
INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。
SQL Server触发器创建、删除、修改、查看
一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录_更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。二: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_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]assql_statement六:删除触发器:基本语句如下:drop trigger trigger_name七:查看数据库中已有触发器:-- 查看数据库已有触发器use jxcSoftwaregoselect * from sysobjects where xtype='TR'-- 查看单个触发器exec sp_helptext '触发器名'八:修改触发器:基本语句如下:alter trigger trigger_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]assql_statement九:相关示例:1:在Orders表中建立触发器,当向Orders表中插入一条订单记录时,检查goods表的货品状态status是否为1(正在整理),是,则不能往Orders表加入该订单。create trigger orderinserton ordersafter insertasif (select status from goods,insertedwhere goods.name=inserted.goodsname)=1beginprint 'the goods is being processed'print 'the order cannot be committed'rollback transaction --回滚,避免加入end2:在Orders表建立一个插入触发器,在添加一条订单时,减少Goods表相应的货品记录中的库存。create trigger orderinsert1on ordersafter insertasupdate goods set storage=storage-inserted.quantityfrom goods,insertedwheregoods.name=inserted.goodsname3:在Goods表建立删除触发器,实现Goods表和Orders表的级联删除。create trigger goodsdeleteon goodsafter deleteasdelete from orderswhere goodsname in(select name from deleted)4:在Orders表建立一个更新触发器,监视Orders表的订单日期(OrderDate)列,使其不能手工修改.create trigger orderdateupdateon ordersafter updateasif update(orderdate)beginraiserror(' orderdate cannot be modified',10,1)rollback transactionend5:在Orders表建立一个插入触发器,保证向Orders表插入的货品名必须要在Goods表中一定存在。create trigger orderinsert3on ordersafter insertasif (select count(*) from goods,inserted where goods.name=inserted.goodsname)=0beginprint ' no entry in goods for this order'rollback transactionend6:Orders表建立一个插入触发器,保证向Orders表插入的货品信息要在Order表中添加alter trigger addOrderon Ordersfor insertasinsert into Orderselect inserted.Id, inserted.goodName,inserted.Number from inserted
sql触发器怎么使用
sql中的触发器是对某个表进行操作时而触发的某种条件,可以用CREATE语句创建触发器,DROP语句删除触发器,ALTER语句禁用触发器等触发器在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。CREATE TRIGGER tr_update_Stock --自动采购触发器ON T_ProductFOR updateASIF (update(Stock)) --判断stock字段是否更新BEGIN --查询出库存低于下限的产品近一个月的消耗量 --创建临时表 IF object_id('[tempdb].[dbo].##table1') IS NOT NULL --判断临时表#tmp是否存在,存在则删除 DROP TABLE ##table1 SELECT * INTO ##table1 FROM (SELECT row_number() OVER (ORDER BY ProductID) AS rowNo,c.ZNumber - c.Stock AS purchaseNum,* FROM ( SELECT ProductID,SUM(s.Numbers) ZNumber,p.Stock,SUM(s.OutMoney) ZMoney,p.Price FROM [dbo].[T_StorageOut] t inner join[dbo].[T_StorageRelation] s ON t.StorageOutID=s.StorageOutID inner join T_Product p ON s.ProductID=p.Id WHERE t.MakerTime between Convert(VARCHAR,DATEADD(MONTH,-1,GETDATE()),23) and Convert(VARCHAR,GETDATE(),23) and ProductID in (SELECT Id FROM V_ProductSupplierInfo where (Stock-StockLowerLimit)<0) GROUP BY ProductID,p.Stock,p.Price) c) ddd--计算用参数DECLARE @purchaseNum INT,@Price NVARCHAR(50),@totalMoney NVARCHAR(50),@ZpurchaseTotal INT --采购数量,单价,总金额,总数量SELECT @totalMoney = 0,@purchaseNum = 0,@Price = 0,@ZpurchaseTotal=0 --采购单所需参数 DECLARE @PurchaseNumber NVARCHAR(50),@DopurchaseId INT,@DopurchaseTime NVARCHAR(200),@PurchaseTotal INT,@PurchasePrice NVARCHAR(200),@PurchaseState INT,@PurchaseType INT SET @PurchaseNumber='JH'+replace(replace(replace(convert(VARCHAR,getdate(),120),'-',''),' ',''),':','') --进货单号JH20138002--采购单详情所需参数 (产品id,产品采购价格) DECLARE @StockProductId INT,@DPurchasePrice NVARCHAR(20)--循环用参数DECLARE @curIndex INT,@rowCount INT--判断用参数DECLARE @OTCount INT,@PTCount INT SET @curIndex = 1SELECT @rowCount = COUNT(1) FROM ##table1IF(@rowCount>0)BEGIN WHILE @curIndex <= @rowCount BEGIN --查询出第一行数据的采购数量,单价,产品id SELECT @purchaseNum = purchaseNum,@Price = Price,@StockProductId =ProductID FROM ##table1 WHERE rowNo = @curIndex --采购总金额 SET @totalMoney = @totalMoney + @purchaseNum * CONVERT (INT,@price) --采购总数量 SET @ZpurchaseTotal =@ZpurchaseTotal + @purchaseNum --单个产品的采购金额 SET @DPurchasePrice=@purchaseNum * CONVERT (INT,@price) IF object_id('[tempdb].[dbo].#PTable') IS NOT NULL --判断临时表#tmp是否存在,存在则删除 DROP TABLE #PTable IF object_id('[tempdb].[dbo].#OTable') IS NOT NULL --判断临时表#tmp是否存在,存在则删除 DROP TABLE #OTable --根据产品id查询出包含该产品的采购单已全部审批 SELECT * INTO #PTable FROM (SELECT PurchaseState FROM [dbo].[T_Purchase_Order] WHERE PurchaseNumber in(SELECT PurchaseOrderId FROM [dbo].[T_Purchase_OrderDetails] WHERE StockProductId=@StockProductId) and PurchaseState=0) AS a --根据产品id查询出包含该产品的订单已全部入库 SELECT * INTO #OTable FROM (SELECT OrderState FROM T_Order WHERE OrderNumber in(SELECT OrderNumber FROM T_OrderDetails WHERE ProductId=@StockProductId) and OrderState=0) AS c SELECT @PTCount = COUNT(1) FROM #PTable SELECT @OTCount = COUNT(1) FROM #OTable IF (@PTCount=0) --已全部审批 BEGIN IF(@OTCount=0) --=0表示包含该产品的订单均已入库,可以生成新的 BEGIN INSERT INTO [dbo].[T_Purchase_OrderDetails] VALUES(@PurchaseNumber,@StockProductId,@purchaseNum,@DPurchasePrice) END END SET @curIndex = @curIndex + 1 ENDEND set @DopurchaseId = 16646 --自动生成 set @DopurchaseTime=Convert(NVARCHAR,getdate(),23) --当前时间 2017-10-31 set @PurchaseTotal =@ZpurchaseTotal set @PurchasePrice =@totalMoney set @PurchaseState =0 --未审核 set @PurchaseType = 2 --自动生成 --变量赋值完成,对采购单做添加操作 IF (@PTCount=0) BEGIN INSERT INTO T_Purchase_Order VALUES(@PurchaseNumber,@DopurchaseId,@DopurchaseTime,@PurchaseTotal,@PurchasePrice,@PurchaseState,@PurchaseType) ENDEND这是一个自动采购的触发器,主要需要注意的触发条件,以及临时表的作用。触发器的使用创建触发器CREATE TRIGGER tr_update_Stock删除触发器 DROP TRIGGER tr_update_Stock禁用ALTER TABLE trig_example DISABLE TRIGGER trig1GO恢复ALTER TABLE trig_example ENABLE TRIGGER trig1GO禁用某个表上的所有触发器ALTER TABLE 你的表 DISABLE TRIGGER all启用某个表上的所有触发器ALTER TABLE 你的表 enable TRIGGER all禁用所有表上的所有触发器exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'启用所有表上的所有触发器exec sp_msforeachtable 'ALTER TABLE ? enable TRIGGER all'
SQl中触发器怎样执行的?
创建触发器 是特殊的存储过程,自动执行,一般不要有返回值。
1、后触发器 (AFTER,FOR)先执行对应语句,后执行触发器中的语句。
2、前触发器 并没有真正的执行触发语句(insert,update,delete),而是执行触发后的语句。
3、行级触发器 (FOR EACH ROW) 在SQL server 中不存在。
扩展资料:创建触发的语法
CREATE TRIGGER trigger_name --触发器名称
ON table_name --触发的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --选择触发器类型
AS --触发后要做的语句
T-SQL语句
GO --结束标记
SQL SERVER数据库触发器的使用
触发器2_初始化环境SQL
初始化环境
触发器3_定义触发器的格式
定义触发器的格式
触发器4_insert 触发器SQL
insert 触发器
触发器5_delete 触发器SQL
delete 触发器
触发器6_update 触发器SQL
update 触发器
sql server2008中的触发器有3种类型,分别为
(1)DML触发器:是指触发器在数据库中发生数据操作语言(DML)事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句也。
(2)DDL触发器:是指当服务器或数据库中发生数据定义语言(DDL)事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。
(3)登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。
sql server2012如何建立触发器
首先你当然要有一个数据库了,这里我使用自己创建的数据库booksDB。
在数据库booksDB上创建触发器,右击触发器->新建触发器,打开之后的界面如下所示
请点击输入图片描述
请点击输入图片描述
在我们上面打开的有代码的界面中,我们需要改动的地方就是我划了红线的地方。我在下面的图中给出了一个小例子。大家可以参照着打下
请点击输入图片描述
执行,刷新,结果如下:
请点击输入图片描述
向books表中增加数据:
我们先导出insert脚本,将需要插入的修改下,如下图,
请点击输入图片描述
请点击输入图片描述
执行,我这里就执行出两条结果,一条是查询insert表的数据,另外一条是查询表books的数据
请点击输入图片描述
6
数据库的增删改查类似
SQL中的“触发器”是什么?
触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程。\x0d\x0a\x0d\x0a触发器一般用在check约束更加复杂的约束上面。例如在执行update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。\x0d\x0a\x0d\x0aSQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 \x0d\x0a\x0d\x0a DML触发器分为: \x0d\x0a 1、 after触发器(之后触发) \x0d\x0a a、 insert触发器 \x0d\x0a b、 update触发器 \x0d\x0a c、 delete触发器 \x0d\x0a 2、 instead of 触发器 (之前触发) \x0d\x0a\x0d\x0a其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 \x0d\x0a\x0d\x0a触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。\x0d\x0a\x0d\x0aUpdate数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。