SQlserver触发器例子trigger

合集下载

SQLServer–Trigger触发器

SQLServer–Trigger触发器

SQLServer–Trigger触发器参考:介绍触发器适合⽤在维护冗余. 它可以监听指定 table 的 insert, update, delete.监听时机分 2 种, after 和 instead ofafter 就是在数据变化之后触发. 在 trigger 中通过访问 inserted 和 deleted 就可以获取改动前后的数据.inserted 和 deleted 是表结构哦, 有多个 row.instead of 是替代原来的执⾏ (原来的执⾏就没有了哦, trigger ⾥⾯要⾃⼰实现), 它在数据还没有执⾏前触发.关于事务Trigger 在运⾏时是⾃带事务的, 哪怕原先的执⾏并没有开启事务.⽽ Isolation 级别默认是依据原先执⾏的事务, 但如果内部修改了 Isolation 当返回外部的时候, Isolation 会⾃动被调回去.关于递归⼀个 trigger ⾥⾯执⾏了另⼀些 insert, update, delete 会继续触发其它 trigger.所以 trigger 是⽀持递归的, 需要⾃⾏控制避免死循环哦.例⼦监听 after insert, 更新冗余 (要记得 inserted 是表⾥⾯有多条数据, 要批量处理)DROP TRIGGER TR_InvoiceItem_AfterInsert_ForRedundancy_Invoice_TotalAmount;GOCREATE TRIGGER TR_InvoiceItem_AfterInsert_ForRedundancy_Invoice_TotalAmount ON InvoiceItemAFTER INSERTASIF (ROWCOUNT_BIG() =0) RETURN;SET NOCOUNT ON;UPDATE Invoice SET TotalAmount = (SELECT SUM(Subtotal) FROM InvoiceItem WHERE InvoiceId = Invoice.InvoiceId)FROM InvoiceINNER JOIN inserted ON Invoice.InvoiceId = inserted.InvoiceId;GO判断 ROWCOUNT_BIG 是有必要的, 因为即便是没有 row 修改 trigger 也会被触发. 如果没有 return 就有可能出现递归死循环.监听 instead of, 做级联删除DROP TRIGGER TR_Invoice_InsteadOfDelete_ForCascade_InvoiceItem;GOCREATE TRIGGER TR_Invoice_InsteadOfDelete_ForCascade_InvoiceItem ON InvoiceINSTEAD OF DELETEASIF (ROWCOUNT_BIG() =0) RETURN;SET NOCOUNT ON;DELETE InvoiceItemFROM InvoiceItemINNER JOIN deleted ON InvoiceItem.InvoiceId = deleted.InvoiceId;DELETE InvoiceFROM InvoiceINNER JOIN deleted ON Invoice.InvoiceId = deleted.InvoiceId;GO列出所有 TriggerSELECT T.[name], M.[definition], T.is_instead_of_triggerFROM sys.triggers TLEFT JOIN sys.sql_modules M ON OBJECT_ID(T.[name]) = M.object_id WHERE T.[type]='TR';删除所有 TriggerDECLARE@dropAllTrigger NVARCHAR(MAX) = N'';SELECT@dropAllTrigger+=N'DROP TRIGGER IF EXISTS '+QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.'+QUOTENAME() + N'; '+NCHAR(13)FROM sys.triggers TLEFT JOIN sys.sql_modules M ON OBJECT_ID(T.[name]) = M.object_id WHERE T.[type]='TR';PRINT@dropAllTrigger;。

sqlserver 触发器判断条件

sqlserver 触发器判断条件

在SQL Server 中,触发器(Trigger)是一种特殊的存储过程,它会在特定的数据修改操作(如INSERT、UPDATE 或DELETE)发生时自动执行。

你可以使用触发器来执行各种任务,如验证数据、执行审计、确保数据完整性等。

在触发器中,你可以使用 INSERTED 和 DELETED 这两个特殊的表来访问被修改的数据。

INSERTED 表包含新插入或修改后的数据,而 DELETED 表包含被删除或修改前的数据。

以下是一个简单的例子,展示了如何在触发器中使用条件判断:
假设我们有一个名为 Employees 的表,我们想在每次插入新员工时检查其工资是否低于某个值(例如2000)。

如果是,则触发器会阻止这次插入操作。

在上述触发器中,我们使用了 INSERTED 表来访问新插入的数据,并使用 ROLLBACK TRANSACTION 来撤销这次插入操作。

我们还使用了 RAISERROR 来抛出一个错误消息,告诉用户为什么插入操作被阻止。

整理的关于SQL Server中事务,触发器和存储过程的介绍以及实际例子

整理的关于SQL Server中事务,触发器和存储过程的介绍以及实际例子

事务事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。

这些操作要么都做,要么都不做,是一个不可分割的工作单位。

通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

(2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

COMMIT表示提交,即提交事务的所有操作。

具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。

ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。

(3):事务运行的三种模式:A:自动提交事务每条单独的语句都是一个事务。

每个语句后都隐含一个COMMIT。

B:显式事务以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。

C:隐性事务在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。

(4):事务的特性(ACID特性)A:原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。

B:一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

一致性与原子性是密切相关的。

C:隔离性(Isolation)一个事务的执行不能被其他事务干扰。

D:持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

注:事务是恢复和并发控制的基本单位。

数据库事务的ACID属性原子性(atomic)(atomicity)事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。

如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。

09-触发器(SQL Server)

09-触发器(SQL Server)

维护数据一致性的触发器示例1 维护数据一致性的触发器示例
设有销售表, 设有销售表,结构如下 create table sales( pro_id char(10) not null, stor_id char(8) not null, s_date smalldatetime not null, qty int, total int default 0)
示例1 示例
定义限制t1表中 列的取值在 定义限制 表中c1列的取值在 到100范围 表中 列的取值在0到 范围 的触发器。 的触发器。 CREATE TRIGGER tri2 ON t1 INSTEAD OF update, insert as if not exists (select * from inserted where c1 not between 0 and 100) insert into t1 select * from inserted
4 前触发型触发器
触发型的触发器, 触发型的触发器,指定执行触发器而不是执行引 发触发器执行的SQL语句,从而替代引发语句的 语句, 发触发器执行的 语句 操作 当为表或视图定义了针对某一操作( 当为表或视图定义了针对某一操作(INSERT、 、 DELETE、UPDATE )的INSTEAD OF 类型触发 、 器且执行了相应的操作时, 器且执行了相应的操作时,尽管触发器被触发但 相应的操作并不被执行, 相应的操作并不被执行,而运行的仅是触发器 SQL 语句本身 在表或视图上,每个INSERT、UPDATE或 在表或视图上,每个 、 或 DELETE语句最多可以定义一个 语句最多可以定义一个INSTEAD OF触 语句最多可以定义一个 触 发器。 发器。 INSTEAD OF触发器不能在有 触发器不能在有WITH CHECK 触发器不能在有 OPTION选项的可更新视图上定义 选项的可更新视图上定义

SQLServer触发器的写法

SQLServer触发器的写法

SQLServer触发器的写法触发器的概念很容易理解,可以简单地看成事件-条件-动作规则。

即特定的事件发生并满足条件,就执行动作,否则啥也不干。

但是触发器的写法不同的书却有很大区别,并且有些在SQLserver 2008 R2上并不能执行,这里记录一种 insert / update / delete 触发器。

创建一个商品表GOODS,eg:1.CREATE TABLE GOODS(2.Gno char(4) PRIMARY KEY,3.Gname char(10),4.Price int);1. INSERT触发器为表GOODS建立一个INSERT触发器,当插入商品的价格高于9999时,拒绝插入(回滚,撤销插入事务)向目标表中插入数据时,会触发该表的Insert 触发器,系统自动在内存中创建inserted表,存放要(已,取决于after/before)插入的数据。

1.CREATE TRIGGER TRI_INSERT ON GOODS2.AFTER INSERT3.AS4.BEGIN5.Declare @pri int;6.Select @pri=Price From inserted7.IF(@pri > 9999)8.Begin9.print('太贵了,价格应小于9999')10.rollback11.END12.END测试触发器:1.INSERT INTO GOODS2.VALUES('1','大白菜','3')成功执行;1.INSERT INTO GOODS2.VALUES('2','菲力牛排','19999')拒绝插入(插入事务被撤销)2. Update触发器在目标表中更新数据时,会触发该表的Update 触发器,系统自动在内存中创建deleted表和inserted表,deleted表存放的是更新前的数据,inserted表存放的是更新后的数据。

sqlserver 触发器示例

sqlserver 触发器示例

sqlserver 触发器示例1--检查当前触发器是否已存在2IF exists(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_INSERTUserInfo_LoginLog')3--存在即删除该触发器4DROP TRIGGER TR_INSERTUserInfo_LoginLog5go6--触发器创建在UserInfo表上当对UserInfo表执行INSERT操作后自动执行触发器中的SQL语句7CREATE TRIGGER TR_INSERTUserInfo_LoginLog8ON UserInfo9FOR INSERT10AS11BEGIN12--定义接受新建用户ID的参数13DECLARE@userID VARCHAR(50);14--查询INSERTED临时表获取新建用户ID15SELECT@userID=UserID FROM Inserted16--向用户登录日志表中添加新建用户登录日志17INSERT INTO LoginLog VALUES(@userID,getDate())18END19GO2021IF EXISTS(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_Update_UserInfo_ManagerLog')22DROP TRIGGER TR_Update_UserInfo_ManagerLog23GO24CREATE TRIGGER TR_Update_UserInfo_ManagerLog25ON UserInfo26FOR UPDATE27AS28--接受被更新用户信息的ID29DECLARE@userId INT30--接受更新前用户密码的变量31DECLARE@oldPwd VARCHAR(50)32--接受更新后用户密码的变量33DECLARE@newPwd VARCHAR(50)34--接受更新前用户邮件的变量35DECLARE@oldEmail VARCHAR(50)36--接受更新后用户邮件的变量37DECLARE@newEmail VARCHAR(50)38--从DELETED临时表中获取数据更新前用户数据39SELECT@userId=UserId,@oldPwd=password,@oldEmail=Em ail FROM Deleted40--从INSERTED临时表中获取数据更新后的用户数据41SELECT@newPwd=password,@newEmail=Email FROM Inserte d42--向系统日志表中插入数据43INSERT INTO managerlog VALUES('修改ID为:['+CAST(@use rId AS VARCHAR(5))+']用户信息:<br/>Password:{'+@oldPwd+'}-->Password:{'+@newPwd+'}<br/>Email:{'+@oldEmail+'}-->{'+@ newEmail+'}',getDate())44Go454647--创建当用户表插入新数据时,添加工资表对应记录的触发器48IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_Emp_EmpPayment')49DROP TRIGGER Insert_Emp_EmpPayment50go51CREATE TRIGGER Insert_Emp_EmpPayment52ON Employee153FOR INSERT54AS55DECLARE@empId INT56SELECT@empId=EmpId FROM Inserted57INSERT INTO EmpPayMent VALUES(@empId,800.00,null) 58go5960--创建当向工资表插入数据时,更新工资表中员工奖金61IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_EmpPayment')62DROP TRIGGER Insert_EmpPayment63go64CREATE TRIGGER Insert_EmpPayment65ON EmpPayMent66FOR INSERT67AS68DECLARE@empId INT69SELECT@empId=EmpId FROM Inserted70UPDATE EmpPayMent SET Bonus=50.00WHERE EmpID=@empId 71go。

SQLSERVER触发器(附有实例)

SQLSERVER触发器(附有实例)

SQLSERVER触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。

它的基本架构:触发器创建语法:(1)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASSql_statement[…n](2)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASIFUPDATE(column)[{AND|OR}UPDATE(COLUMN)][…]IF(COLUMNS_UPDATED())Sql_statement[…n]注:(不同数据库⽀持不同的类型触发器,有些还⽀持before类型触发器,像SQL server 就不⽀持before触发器)SQL Server⽀持两种类型的触发器AFTER触发器和INSTEAD OF 触发器,其中、AFTER触发器要求只有执⾏某⼀操作ISERT, UPDATE ,DELETE之后触发器才被触发。

1)INSTEAD OF 触发器表⽰并不执⾏其所定义的操作INSERT,UPDATE ,DELETE,⽽仅是执⾏触发器本⾝,既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器。

2)after 触发器(也叫“FOR”触发器)则会在触发 insert、update 或是delect 动作之后执⾏。

触发事件分为三类:UPDATE、DELETE和INSERT。

另外,定义触发器时,系统都都会⾃动⽣成两张表,我们是可以直接⽤的,如下:如下是实例(都是亲⼿实践过的):1.在表Student中建⽴删除触发器,实现表Student和表SC的级联删除,也就是只要删除表Student中的元组学号为s1,则表SC中SNO为s1的元组也要删除;建⽴完触发器后⽤企业管理器删除Student中学号为30的元组,看看表SC中SNO为30的选课记录是否也⼀起删除;create trigger t_std2 on studentinstead of deleteasbegindeclare @id char(5)select @id=sno from deleteddelete from sc where SNo =@iddelete from student where SNo=@idendgodelete from Student where SNo='00002'/*2. 在表Course中增加⼀个职业规划选修课,为(005,职业规划,4,0014),在表SC中建⽴⼀个触发器,实现规定年龄24岁以上(包括24岁)的学⽣才能选修职业规划这门课程,如果年龄⼩于24岁,则输出’年龄⼩于24,不能选修该门课程’,插⼊失败,⽤SQL语句在SC表中分别插⼊(‘00001’,’005’,null)和(‘00005’,’005’,null)看看结果;**/create trigger t_sc on scfor insertasbegindeclare @id char(5)select @id=sno from insertedif((select cno from inserted)='005' and (select sage from student where SNo= @id )<24)beginprint '年龄⼩于24,不能选修该门课程 'rollback transactionendelseprint 'nice!'endinsert into course values('005','职业规划','4','0014')insert into sc values('00001','005',null)insert into sc values('00005','005',null)select * from scgo3.在表SC中建⽴更改触发器,实现表SC中的修改后的成绩不能低于修改前的成绩,如果修改后的成绩低于修改前的成绩,则输出’修改后的成绩⽐修改前低,不能修改’,修改失败,⽤SQL语句把学号为00001,课程号为001的成绩分别改为90和70,看看结果;createtrigger t2_sc on scafter updateasif(update(score))begindeclare @score1 numeric(3,1),@score2numeric(3,1)select @score1=score from insertedselect @score2=score from deletedif(@score1>@score2 )print 'nice! 'elseupdate scset sc.Score=@score2 from sc,deletedwhere sc.SNo=deleted.SNo o=oprint '失败'endupdate scsetScore=70 where SNo='00001' and CNo='001'4. 在表Teacher中创建触发器,实现如果更新了表Teacher中的年龄和⼯资,则输出’更新了年龄和⼯资’,如果更新了年龄没有更新⼯资,则输出’更新了年龄’,如果更新了⼯资⽽没有更新年龄,则输出’更新了⼯资’,创建完后使⽤SQL语句把tno为001的年龄加1,把tno为002的⼯资加1,把tno为003的年龄和⼯资都加1,看看结果;create trigger t_teacher on teacherafter updateasbegindeclare @age int,@sal floatselect @age=age from deletedselect @sal=sal from deletedif(@age <> (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄和⼯资 'else if(@age <> (select age from inserted )and @sal =(select sal from inserted))print '更新了⼯资 'else if(@age = (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄 'endupdate Teacherset age=age+1 where Tno='0001'**//**5. 在不删除触发器的前提下,使3创建的触发器⽆效;alter table teacher disable trigger t_teacher**//**6. 创建⼀个名为tri_Delete_C的触发器,要求⾸先判断数据库中是否已经存在名为tri_Delete_C的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。

SQL Server 2000 创建触发器

SQL Server 2000 创建触发器

1.使用T-SQL语句创建触发器创建触发器使用CREATE TRIGGER语句。

语法格式如下:CREATE TRIGGER 触发器名ON 表名 [WITH ENCRYPTION]FOR {[DELETE][,][INSERT][,][UPDATE] } [NOT FOR REPLICATION]ASSQL语句[RETURE 整数表达式]触发器作为一种数据库对象,在syscomment 表中存储有完整的文本定义信息。

可以使用WITH ENCRYPTION 对访问syscomment表的入口进行加密。

NOT FOR REPLICATION:定义在复制过程中,不执行触发器操作。

【例1】创建一个针对LWQK 表的触发器,打印共修改了多少行数据。

use lwzzif exists (select name from sysobjectswhere name='tr_lwqk_update' and type='tr')drop trigger tr_lwqk_updategouse lwzzgocreate trigger tr_lwqk_update on lwqkfor updateasdeclare @msg varchar(100)select @msg=str(@@rowcount)+'lwzz updated by this statement'print @msgreturngo在CREA TE TRIGGER语句中不能使用SELECT语句返回对表格查询的数据,因为触发器不接受用户应用程序传递的参数,从而也无法向用户应用程序返回查询表格数据所得到的结果。

在创建触发器的语句中,禁止使用下列T-SQL语句:ALTER DATABASE ALTER PROCEDUREALTER TABLE ALTER TRIGGERALTER VIEW CREATE DATABASECREATE DEFAULT CREATE INDEXCREATE PROCEDURE CREATE RULECREATE TABLE CREATE TRIGGERDROP DATABASE DROP DEFAULTDROP INDEX DROP PROCEDUREDROP RULE DROP TABLEDROP TRIGGER DROP VIEWDATABASE GRANT RESTORE RESTORE LOG REVOKETRUNCATE TABLE由于系统表所存储数据的特殊性和重要性,所以建议用户不要自己在系统表上建立触发器。

sqlserver触发器

sqlserver触发器

[例4] 删除学生表上的触发器Insert_Or_Update_Student
DROP TRIGGER Insert_Or_Update_Student;
试验
在SC表上建立触发器SC_1,当成绩大于100分 时,自动修改为100分。 通过UPDATE 和INSERT语句触发SC_1,检查 是否正确 删除触发器SC_1
5.6.1 定义触发器
5.6.2 激活触发器 5.6.3 删除触发器
5.6.2 激活触发器

触发器的执行,是由触发事件激活的,并由数据库服务器 自动执行 一个数据表上可能定义了多个触发器

激活触发器(续)
[例3]执行修改某个教师工资的SQL语句,激活
上述定义的触发器。 UPDATE student SET Sage=16 WHERE sno='95001'; 执行顺序是:
定义触发器(续)
[例2]定义触发器,当Student学号发生修 改时,自动在变化表S_log登记修改记录。
首先建立变化表S_log
CREATE TABLE S_log ( ID int Date ); IDENTITY (1, 1), DATETIME, sno char(10),
PRIMARY KEY(ID)
定义触发器(续)

定义触发器的语法说明:

1. 创建者:表的拥有者 2. 触发器名 3. 表名:触发器的目标表 4. 触发事件:INSERT、DELETE、UPDATE 5. 操作时机
FOR | AFTER
触发器里面的两个临时的表: Deleted , Inserted 分别表示触发事件的表“旧记录”和“新记 录”。
CREATE TRIGGER Update_S

sqlserver触发器

sqlserver触发器

CREATE TRIGGER t_dalii ON [dbo].[员工明细表]FOR INSERTASdeclare @v_char1 varchar(20),@v_char2 varchar(20),@v_char3 int,@v_char4 varchar(20),@v_char5 datetimebeginset @v_char1=(select 所属部门 from inserted)if @v_char1<>nullbeginif exists(select 部门号 from 部门状态表 where 部门=@v_char1)set @v_char2=(select 部门号 from 部门状态表 where 部门=@v_char1)elseset @v_char2=((select max(部门号) from 部门状态表 )+1)endset @v_char3=(select 编号 from inserted)set @v_char4=(select 姓名 from inserted)set @v_char5=(select 入厂时间 from inserted)insert into 部门人员表 (部门号,部门,编号,姓名,员工属性,进部门时间,是否在职,是否下岗 )values(@v_char2,@v_char1,@v_char3,@v_char4,''职员'',@v_char5,''是'',''否'')end---------------------------------------------------------------:create trigger tr_nameon table/view{for ¦ after ¦ instead of } [update][,][insert][,][delete][with encryption]as {batch ¦ if update (col_name) [{and ¦or} update (col_name)] }说明:1 tr_name :触发器名称2 on table/view :触发器所作用的表。

SQLServer-触发器使用实例

SQLServer-触发器使用实例

SQLServer-触发器使用实例SQLServer 触发器使用实例触发器是一个特殊的存储过程。

常见的有三种:分别应用于Insert , Update , Delete 事件。

一、Trigger语法:create trigger tr_nameon table/view{for | after | instead of } [update][,][insert][,][delete] [with encryption]as {batch | if update (col_name) [{and|or} update (col_name)] } 说明:1 tr_name :名称2 on table/view :触发器所作用的表。

一个触发器只能作用于一个表3 for 和after :同义4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别After在触发事件发生以后才被激活,只可以建立在表上Instead of代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。

注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:| 虚拟表Inserted | 虚拟表Deleted 在表记录新增时| 存放新增的记录 | 不存储记录修改时 | 存放用来更新的新记录 | 存放更新前的记录删除时| 不存储记录| 存放被删除的记录一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

对于2,创建一个Delete触发器Create trigger trdStudentOn Studentfor DeleteAsDelete BorrowRecordFrom BorrowRecord br , Delted dWhere br.StudentID=d.StudentID对于3,创建一个Insert触发器create Trigger testdbon myStudentfor insertasbegininsert into BorrowRecord(StudentID,Sex) select studentid,username from inserted myStudentend从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。

SQLServer:触发器实例详解

SQLServer:触发器实例详解

SQLServer:触发器实例详解1. 概述触发器是⼀种特殊的存储过程,它不能被显式地调⽤,⽽是在往表中插⼊记录﹑更新记录或者删除记录时被⾃动地激活。

所以触发器可以⽤来实现对表实施复杂的完整性约束。

2. 触发器的分类SQL Server2000提供了两种触发器:“Instead of” 和“After” 触发器。

⼀个表或视图的每⼀个修改动作(Insert、Update和Delete)都可以有⼀个“Instead of” 触发器,⼀个表的每个修改动作都可以有多个“After”触发器。

2.1 “Instead of”触发器“Instead of”触发器在执⾏真正“插⼊”之前被执⾏。

除表之外,“Instead of” 触发器也可以⽤于视图,⽤来扩展视图可以⽀持的更新操作。

“Instead of”触发器会替代所要执⾏的SQL语句,⾔下之意就是所要执⾏SQL并不会“真正执⾏”alter trigger trigger_学⽣_Deleteon 学⽣instead of Deleteasbeginselect 学号, 姓名 from deletedenddelete from 学⽣ where 学号 = 4上例中定义了“trigger学⽣_Delete”触发器,该触发器从“delete”表中打印出所要删除的学⽣.在执⾏“delete”操作后,会发现“学号 = 4”的学⽣并未被删除,原因在于“trigger学⽣Delete”替代了所要执⾏的“delete from 学⽣ where 学号 = 4”语句,⽽在“trigger学⽣_Delete”中并未真正删除学⽣。

2.2 “After”触发器“After”触发器在Insert、Update或Deleted语句执⾏之后被触发。

“After”触发器只能⽤于表。

“After”触发器主要⽤于表在修改后(insert、update或delete操作之后),来修改其他表3. Inserted和Deleted表SQL Server为每个触发器都创建了两个专⽤表:Inserted表和Deleted表。

SQLServer数据库技术-08触发器

SQLServer数据库技术-08触发器

14
设计触发器
15
例:为Products表添加触发器
CREATE TRIGGER 产品_Insert ON Products AFTER INSERT AS BEGIN print '又添加了一种产品' END GO Insert into Products(ProductName) values ('Product') Go
4
触发器的功能




完成比约束更复杂的数据约束 检查所做的SQL是否允许 修改其他数据表里的数据 调用更多的存储过程 发送SQL Mail 返回自定义的错误信息 更改原来要操作的SQL语句 防止数据表结构更改或数据表被删除
5
触发器分类

DML触发器
After触发器 Instead of触发器


21
Sp_settriggerorder 触发器名,激活次序,激活触发器的动作
例:设置触发器次序 Exec sp_settriggerorder '产品_Insert1','First','Insert' go Exec sp_settriggerorder '产品_Insert','Last','Insert' Go
8
在“产品库存”表里,如果要删除一条产品记录 ,在删除记录时,触发器可以检查该产品库存数 量是否为0,如果不为0则取消删除操作。 Step1:接收SQL语句,将要从“产品库存”表里删 除的记录取出来,放在删除表里。 Step2:从“产品库存”表里删除该产品记录。 Step3:从删除表里读出该产品的库存数量字段, 判断是不是0。如果是0,完成操作,从内存中清 除删除表;如果不为0,用Rollback Transaction语 句回滚操作。

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析数据库开发-sql server触发器如何使用实例解析在数据库开发中,触发器是一种特殊的存储过程,它会在数据库表发生特定事件时自动执行。

触发器可以帮助我们实现数据的自动化处理和一些复杂的业务逻辑。

在本文中,我将详细介绍SQL Server触发器的使用实例,以帮助您更好理解和应用这一重要的数据库开发技术。

1. 触发器的基本概念在开始之前,让我们先来了解一下触发器的基本概念。

触发器是一种特殊的存储过程,它与数据库表相关联,并在表发生特定事件时自动执行。

这些特定事件包括INSERT、UPDATE和DELETE操作。

触发器可以在数据被修改之前或之后执行,这取决于触发器的类型,分为BEFORE和AFTER两种。

2. SQL Server触发器的创建在SQL Server中,我们可以使用CREATE TRIGGER语句来创建触发器。

以下是一个简单的创建触发器的示例:```sqlCREATE TRIGGER [触发器名称]ON [表名]FOR INSERT, UPDATE, DELETEASBEGIN-- 触发器的逻辑代码END```在上面的示例中,[触发器名称]表示触发器的名称,[表名]表示要关联的数据库表,FOR子句指定了触发器要响应的事件类型,AS子句中包含了触发器的逻辑代码。

3. 触发器的使用实例现在让我们来看一个实际的使用实例,假设我们有一个名为Student的表,其中包含了学生的尊称和芳龄信息。

我们想要在插入新的学生信息时,自动向另外一个名为StudentLog的表中插入一条日志信息,以便记录学生信息的变更历史。

我们可以通过触发器来实现这一功能。

```sqlCREATE TRIGGER trgAfterInsertON StudentAFTER INSERTASBEGININSERT INTO StudentLog (操作类型, 学生尊称, 操作时间)SELECT '新增', inserted.尊称, GETDATE()FROM insertedEND```在上面的示例中,我们创建了一个AFTER INSERT类型的触发器,当向Student表中插入新记录时,触发器会自动执行并向StudentLog 表中插入一条日志信息。

SQLServer触发器实例详解

SQLServer触发器实例详解

SQLServer触发器实例详解Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。

触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。

触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。

⽽存储过程可以通过存储过程的名称被调⽤。

Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。

触发器⼀般⽤在check约束更加复杂的约束上⾯。

触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。

诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。

SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。

优点触发器可通过数据库中的相关表实现级联更改;通过级联引⽤完整性约束可以更有效地执⾏这些更改。

触发器可以强制⽐⽤ CHECK 约束定义的约束更为复杂的约束。

与 CHECK 约束不同,触发器可以引⽤其它表中的列。

例如,触发器可以使⽤另⼀个表中的 SELECT ⽐较插⼊或更新的数据,以及执⾏其它操作,如修改数据或显⽰⽤户定义错误信息。

触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。

⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。

既可以在表上定义instead of触发器,也可以在视图上定义。

SQLServer创建触发器(trigger)

SQLServer创建触发器(trigger)

SQLServer创建触发器(trigger)from:https:///Brambling/archive/2017/04/21/6741666.html触发器简介:触发器是⼀种特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿动执⾏,⽽是由事件来触发。

触发器是当对某⼀个表进⾏操作。

例如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。

触发器分类:1、DML(数据操纵语⾔ Data Manipulation Language)触发器:是指触发器在数据库中发⽣ DML 事件时将启⽤。

DML事件是指在表或视图中对数据进⾏的 insert、update、delete 操作的语句。

2、DDL(数据定义语⾔ Data Definition Language)触发器:是指当服务器或数据库中发⽣ DDL 事件时将启⽤。

DDL事件是指在表或索引中的 create、alter、drop 操作语句。

3、登陆触发器:是指当⽤户登录 SQL SERVER 实例建⽴会话时触发。

如果⾝份验证失败,登录触发器不会触发。

其中 DML 触发器⽐较常⽤,根据 DML 触发器触发的⽅式不同⼜分为以下两种情况:after 触发器(之后触发):其中 after 触发器要求只有执⾏ insert、update、delete 某⼀操作之后触发器才会被触发,且只能定义在表上。

instead of 触发器(之前触发):instead of 触发器并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。

可以在表或视图上定义 instead of 触发器。

DML 触发器有两个特殊的表:插⼊表(instered)和删除表(deleted),这两张表是逻辑表。

这两个表是建⽴在数据库服务器的内存中,⽽且两张表的都是只读的。

这两张表的结构和触发器所在的数据表的结构是⼀样的。

当触发器完成⼯作后,这两张表就会被删除。

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例SqlServer触发器的原理及案例合理的选⽤触发器会让你的系统更⾼效2010Ssc⽬录第1章何为触发器 (3)1.1 触发器的'本质' (3)1.2 这样做带来的'功能': (3)1.3 触发器的作⽤ (3)1.4 说明: (3)第2章对触发器3种操作的分析 (4)2.1 创建触发器 (4)2.2 学习案例 (5)2.2.1 建⽴表 (5)2.2.2 触发器练习1 (5)2.2.3 触发器练习2: (6)第3章图形化操作触发器 (7)3.1 查看触发器情况 (7)第4章触发器中的变量操作 (11)第5章SQL触发器语法参考 (11)第1章何为触发器1.1触发器的'本质'触发器是⼀种特殊的存储过程,它不能被显式地调⽤,⽽是在往表中插⼊记录、更改记录或者删除记录时,当事件发⽣时,才被⾃动地激活。

1.2这样做带来的'功能':触发器可以⽤来对表实施复杂的完整性约束,保持数据的⼀致性,当触发器所保护的数据发⽣改变时,触发器会⾃动被激活,响应同时执⾏⼀定的操作(对其它相关表的操作),从⽽保证对数据的不完整性约束或不正确的修改。

触发器可以查询其它表,同时也可以执⾏复杂的T-SQL语句。

触发器和引发触发器执⾏的命令被当作⼀次事务处理,因此就具备了事务的所有特征。

注意:'事务具备什么特征?在触发器中的作⽤?'如果发现引起触发器执⾏的T-SQL语句执⾏了⼀个⾮法操作,⽐如关于其它表的相关性操作,发现数据丢失或需调⽤的数据不存在,那么就回滚到该事件执⾏前的SQL SERVER数据库状态。

1.3触发器的作⽤触发器可以对数据库进⾏级联修改,这⼀点刚才已经说过了。

需要说明的是:'触发器和约束的关系和区别'(1)⼀般来说,使⽤约束⽐使⽤触发器效率更⾼。

(2)同时,触发器可以完成⽐CHECK约束更复杂的限制。

SQLServer存储过程与触发器

SQLServer存储过程与触发器
– DML触发器又分为两类:After触发器和Instead Of触发器
DDL触发器:
– DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于 执行数据库中管理任务。如审核和规范数据库操作、防止 数据库表结构被修改等。
– SQL SERVER 2005新增添功能
– 对于这两个表,用户只有读取的权限,没有修改的权限。 – 这两个表的结构与触发器所在数据表的结构是完全一致的,
当触发器的工作完成之后,这两个表也将会从内存中删除。
插入表里存放的是更新前的记录
– 对于插入记录操作来说,插入表里存放的是要插入的数据 – 对于更新记录操作来说,插入表里存放的是要更新的记录。
检查所做的SQL是否允许
– 触发器可以检查SQL所做的操作是否被允许。
例如:在产品库存表里,如果要删除一条产品记录,在删除记录时, 触发器可以检查该产品库存数量是否为零,如果不为零则取消 该删除操作。
修改其它数据表里的数据
– 当一个SQL语句对数据表进行操作的时候,触发器可以根据 该SQL语句的操作情况来对另一个数据表进行操作。
– 系统存储过程在Master数据库中,在其他数据库中 可以直接调用,调用时不必在存储过程名前加上数 据库名。
2021/5/4
4
自定义存储过程
自定义存储过程是由用户创建并能完成 某一特定功能的存储过程。
2021/5/4
5
存储过程的优点
1.提高应用程序的通用性和可移植性 2.可以更有效地管理用户操作数据库的权限 3.可以提高T-SQL的速度 4.减轻服务器的负担 5.块化程序设计。 6.减少操作错误。 7.能自动处理复杂的或敏感的事务。 8.可以实现管理任务自动化。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
@RTorque_Avg=RTorque_Avg,
@CasingPr=CasingPr,
@ChokePr=ChokePr,
@RigHeave=RigHeave,
@TideComp=TideComp,
@Pump_1_Freq=Pump_1_Freq,
@Pump_1_Counts=Pump_1_Counts,
declare @CasingPr real
declare @ChokePr real
declare @RigHeave real
declare @TideComp real
declare @Pump_1_Freq real
declare @Pump_1_Counts real
@RotaryFreqTotal=RotaryFreqTotal,
@RotaryCountsTotal=RotaryCountsTotal,
@HookLoad=HookLoad,
@HookLoad_Min=HookLoad_Min,
@HookLoad_Max=HookLoad_Max,
declare @DataStr varchar(8000)
-- 生成查询新增数据的sql语句
select
@TimeStamp=TimeStamp,
@MDepth=MDepth,
@BDepth=BDepth,
@VDepth=VDepth,
@BlockHeight=BlockHeight,
declare @CircTime real
declare @dcExp real
declare @KillPr real
declare @ROPMinperIntvl real
declare @CementPR real
declare @DiffSPP real
declare @TotalGas_Max real
declare @Amb_Gas_05 real
declare @Amb_Gas_06 real
declare @C1 real
declare @C2 real
declare @C3 real
declare @iC4 real
declare @nC4 real
declare @iC5 real
declare @nC5 real
declare @Acetylene real
declare @ChromStartTime datetime
declare @CO2 real
declare @H2S real
declare @LagDepth real
declare @ECD real
declare @Pit_3_Volume real
declare @Pit_4_Volume real
declare @Pit_5_Volume real
declare @Pit_6_Volume real
declare @Pit_7_Volume real
declare @Pit_8_Volume real
declare @Pump_1_Flow real
declare @Pump_2_Freq real
declare @Pump_2_Counts real
declare @Pump_2_Flow real
declare @Pump_3_Freq real
declare @Pump_3_Counts real
@Pump_1_Flow=Pump_1_Flow,
@Pump_2_Freq=Pump_2_Freq,
declare @Pit_18_Volume real
declare @Pit_19_Volume real
declare @Pit_20_Volume real
declare @PWDEMW real
declare @PWDEMWPOMin real
declare @PWDEMWPOMax real
declare @MFInToBit real
declare @MFInToRiser real
declare @MFInToMudCap real
declare @MFInToNone real
declare @Pit_1_Volume real
declare @Pit_2_Volume real
declare @RotaryFreq real
declare @RotaryCounts real
declare @RotaryFreqBit real
declare @RotaryCountsBit real
declare @RotaryFreqTotal real
declare @RotaryCountsTotal real
declare @Pit_Slug_Volume real
declare @PVT real
declare @Pit_Active_GL real
declare @Pit_Trip_GL real
declare @MFOut real
declare @TempIn real
declare @TempOut real
declare @Swurge real
declare @MSE real
declare @ExpPVT real
declare @ExpHookLoad real
declare @TonMiles real
declare @Activity real
declare @Synch int
declare @SPP_Max real
declare @SPP_Avg real
declare @RTorque real
declare @RTorque_Min real
declare @RTorque_Max real
declare @RTorque_Avg real
@BlockSpeed=BlockSpeed,
@ROP=ROP,
@WOB=WOB,
@aRPM=aRPM,
@RotaryFreq=RotaryFreq,
@RotaryCounts=RotaryCounts,
@RotaryFreqBit=RotaryFreqBit,
@RotaryCountsBit=RotaryCountsBit,
declare @aMFIn real
declare @ExpMFOut real
declare @FlowInDiff real
declare @MPDPr real
declare @Circulating int
lare @OnSlips int
declare @SpareLag1 real
declare @SpareLag2 real
declare @SpareLag3 real
declare @Spare1 real
declare @Spare2 real
declare @Spare3 real
declare @PPG real
declare @FlowDiff real
declare @C1z real
declare @C2z real
declare @C3z real
declare @iC4z real
declare @nC4z real
declare @iC5z real
declare @nC5z real
@HookLoad_Avg=HookLoad_Avg,
@SPP=SPP,
@SPP_Min=SPP_Min,
@SPP_Max=SPP_Max,
@SPP_Avg=SPP_Avg,
@RTorque=RTorque,
@RTorque_Min=RTorque_Min,
@RTorque_Max=RTorque_Max,
declare @Pit_9_Volume real
declare @Pit_10_Volume real
declare @Pit_11_Volume real
declare @Pit_12_Volume real
declare @Pit_Active_Volume real
declare @Pit_Trip_Volume real
declare @MFInToHole real
declare @TotalGas real
declare @irCH4 real
declare @Amb_Gas_01 real
declare @Amb_Gas_02 real
declare @Amb_Gas_03 real
declare @Amb_Gas_04 real
-- 创建触发器
create TRIGGER AddData
on [Time]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- 声明数据表中的字段变量
declare @TimeStamp datetime
declare @MDepth real
declare @BDepth real
declare @VDepth real
declare @BlockHeight real
declare @BlockSpeed real
相关文档
最新文档