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代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。
此外,因为delete 操作只对行有影响,所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。
7 触发器执行时用到的两个特殊表:deleted ,inserteddeleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构和触发器作用的表结构是一样的,只是存放的数据有差异。
二、实例:实例1(注意这里的关联,条件是如何关联,update中set的值是和谁关联。
这些都可以从【触发器的两个临时表:inserted、deleted】中得到答案)比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号StudentName varchar(50),姓名)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然和这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
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触发器的原理及案例

触发器⏹触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(INSERT、UPDATE 或DELETE)时自动执行⏹触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句⏹主要用于强制复杂的业务规则或要求优点⏹自动执行⏹实现相关表层叠修改,实现多个表之间数据的一致性和完整性⏹实现比check约束更复杂的限制,可以引用其他表中的列触发器的类型⏹AFTER触发器:在数据变动(INSERT、UPDATE、DELETE操作)完成后激发,只能在表上定义,同一个表中可以有多个AFTER触发器⏹INSTEAD OF触发器:在数据变动以前被激发,并取代变动数据(INSERT、UPDATE、DELETE操作),转而去执行触发器定义的操作,可以定义在表或视图上,每个update、insert和delete语句最多可以定义一个INSTEAD OF触发器。
创建触发器⏹CREATE TRIGGER trigger_nameON { table | view } [ WITH ENCRYPTION ]{{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]}ASsql_statement [...n ]}触发器示例:⏹CREATE TRIGGER reminder ON titles FOR INSERT, UPDATEASRAISERROR (50009, 16, 10)指定触发器何时激发⏹AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激发。
可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。
⏹INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。
⏹对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个INSTEAD OF 触发器。
sqlserver触发器例题

sqlserver触发器例题SQL Server 触发器是一种数据库对象,它可以在特定表上的数据发生更改时自动执行一系列操作。
触发器可以用于实现业务规则和数据完整性约束,以及跟踪数据变化等功能。
在本文中,我们将介绍两个 SQL Server 触发器的例题及其解决方案。
例题一:在一张名为"Employee"的表上创建一个触发器,以便在插入新员工记录时自动将当前日期作为"hire_date"字段的默认值。
解决方案:首先,我们需要使用下面的 SQL 命令创建一个名为"Employee"的表,并在该表中添加一个"hire_date"字段:```sql CREATE TABLE Employee ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), hire_date DATE ) ```接下来,我们可以使用下面的 SQL 命令创建一个名为"trg_Employee_Insert"的触发器:```sql CREATE TRIGGER trg_Employee_Insert ON Employee FOR INSERT AS BEGIN UPDATE Employee SET hire_date = GETDATE() WHERE employee_id IN (SELECT employee_id FROM inserted) END ```在这个触发器中,我们使用了"FOR INSERT"来指定触发器在插入操作之后执行。
然后,我们使用了"GETDATE()"函数来获取当前日期,并将其更新到"hire_date"字段中。
现在,当我们向"Employee"表中插入一条新的员工记录时,触发器将自动将当前日期作为"hire_date"字段的默认值:```sql INSERT INTO Employee (employee_id, employee_name) VALUES (1, 'John') ```例题二:在一张名为"Orders"的表上创建一个触发器,以便在删除订单记录时自动将相应的产品库存加回去。
sqlserver 触发器if else语句

sqlserver 触发器if else语句SQL Server 触发器是一个使 SQL Server 数据库自动执行某些操作的特殊程序。
在执行特定的 SQL Server 数据库操作时,SQL Server 总是先运行触发器,然后再执行所请求的操作。
触发器可以执行各种操作,例如插入、更新或删除数据。
在编写一个 SQL Server 触发器时,可以使用 if else 语句来控制不同的操作。
If else 语句是 SQL Server 中常用的控制语句,可以根据指定的条件执行不同的操作。
在 SQL Server 触发器中,if else 语句可以用来控制触发器在满足特定条件时执行特定的 SQL 代码。
一个简单的 if else 语句可以如下所示:IF conditionBEGIN--执行操作AENDELSEBEGIN--执行操作BEND在 SQL Server 触发器中,if else 语句可以用于控制触发器执行特定的操作。
例如,可以在触发器中使用 if else 语句来检查特定的条件,然后基于该条件对目标表进行插入、更新或删除操作。
以下是一个在 SQL Server 触发器中使用 if else 语句的示例: CREATE TRIGGER trigger_nameON table_nameAFTER INSERT --触发器会在插入操作之后执行,其他操作类似ASBEGINDECLARE @var1 INT; --定义变量SET @var1 = (SELECT COUNT(*) FROM table_name); --将表中的行数赋给变量IF (@var1 > 10) --检查条件BEGIN--执行操作AUPDATE table_name SET column1='new_value' WHEREcolumn2='value2';ENDELSEBEGIN--执行操作BDELETE FROM table_name WHERE column3='value3';ENDEND;以上触发器将在插入操作之后执行,如果表中行数大于10,则更新列1,否则删除特定列的值。
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的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。
SQLServer2000编程之触发器

李四
1000 0002 20001
检查deleted和inserted表中的数据,确定是 否需要回滚或执行其他操作
UPDATE触发器示例
问题:
跟踪用户的交易,交易金额超过20000元,则取消交易,并 给出错误提示。
分析:
在bank表上创建UPDATE触发器 修改前的数据可以从deleted表中获取 修改后的数据可以从inserted表中获取
inserted 和deleted 表
修改操作
inserted表 deleted表
增加 (INSERT)记 录
存放新增的记 录
------
删除 (DELETE)记 录
-----
存放被删除的 记录
修 (U改PDATinEs)e记rted表存 记和放录d更ele新te后d表的存放存记的放录信更息 新前的
从deleted表中 获取被删除的
交易记录
IF NOT EXISTS(SELECT * FROM sysobjects
WHERE name='backupTable')
SELECT * INTO backupTable FROM deleted
ELSE
INSERT INTO backupTable
SELECT * FROM deleted
帐户信息表bank
张三开户1000元, 李四开户1元
张三取钱200
问题:
交易信息表transInfo
没有自动修改张三的余额
最优的解决方案就是采用触发器:
它是一种特殊的存储过程
也具备事务的功能
它能在多表之间执行特殊的业务规则
1.什么是触发器
赵二退休 删除
员工表
sqlserver 触发器if else语句

sqlserver 触发器if else语句在SQLServer中,触发器是一种特殊的存储过程,它们在数据库中的表上自动执行,通常用于在表上进行特定操作时执行其他操作。
在触发器中,可以使用 IF ELSE 语句以根据条件执行不同的操作。
以下是一个示例触发器,其中包含 IF ELSE 语句:CREATE TRIGGER [dbo].[trig_example]ON [dbo].[example_table]AFTER INSERT, UPDATE, DELETEASBEGIN-- Check if INSERTIF EXISTS (SELECT * FROM inserted)BEGINPRINT 'New rows added'-- Insert additional data into another tableINSERT INTO [dbo].[additional_table] (column1, column2) SELECT column3, column4 FROM insertedEND-- Check if UPDATEELSE IF EXISTS (SELECT * FROM deleted)BEGINPRINT 'Rows updated'-- Update data in another tableUPDATE [dbo].[additional_table] SET column1 =inserted.column3FROM [dbo].[additional_table]INNER JOIN inserted ON inserted.id =[dbo].[additional_table].idEND-- Check if DELETEELSEBEGINPRINT 'Rows deleted'-- Delete data from another tableDELETE FROM [dbo].[additional_table]WHERE id IN (SELECT id FROM deleted)ENDEND该触发器在 example_table 上创建,并根据 INSERT、UPDATE 和DELETE 操作执行不同的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sqlserver 触发器示例
1--检查当前触发器是否已存在
2IF exists(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_INSERTUserInfo_LoginLog')
3--存在即删除该触发器
4DROP TRIGGER TR_INSERTUserInfo_LoginLog
5go
6--触发器创建在UserInfo表上当对UserInfo表执行INSERT操作后自动执行触发器中的SQL语句
7CREATE TRIGGER TR_INSERTUserInfo_LoginLog
8ON UserInfo
9FOR INSERT
10AS
11BEGIN
12--定义接受新建用户ID的参数
13DECLARE@userID VARCHAR(50);
14--查询INSERTED临时表获取新建用户ID
15SELECT@userID=UserID FROM Inserted
16--向用户登录日志表中添加新建用户登录日志
17INSERT INTO LoginLog VALUES(@userID,getDate())
18END
19GO
20
21IF EXISTS(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_Update_UserInfo_ManagerLog')
22DROP TRIGGER TR_Update_UserInfo_ManagerLog
23GO
24CREATE TRIGGER TR_Update_UserInfo_ManagerLog
25ON UserInfo
26FOR UPDATE
27AS
28--接受被更新用户信息的ID
29DECLARE@userId INT
30--接受更新前用户密码的变量
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 Deleted
40--从INSERTED临时表中获取数据更新后的用户数据
41SELECT@newPwd=password,@newEmail=Email FROM Inserte d
42--向系统日志表中插入数据
43INSERT INTO managerlog VALUES('修改ID为:['+CAST(@use rId AS VARCHAR(5))+']用户信息:<br/>Password:{'+@oldPwd+'}-
->Password:{'+@newPwd+'}<br/>Email:{'+@oldEmail+'}-->{'+@ newEmail+'}',getDate())
44Go
45
46
47--创建当用户表插入新数据时,添加工资表对应记录的触发器
48IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_Emp_EmpPayment')
49DROP TRIGGER Insert_Emp_EmpPayment
50go
51CREATE TRIGGER Insert_Emp_EmpPayment
52ON Employee1
53FOR INSERT
54AS
55DECLARE@empId INT
56SELECT@empId=EmpId FROM Inserted
57INSERT INTO EmpPayMent VALUES(@empId,800.00,null) 58go
59
60--创建当向工资表插入数据时,更新工资表中员工奖金
61IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_EmpPayment')
62DROP TRIGGER Insert_EmpPayment
63go
64CREATE TRIGGER Insert_EmpPayment
65ON EmpPayMent
66FOR INSERT
67AS
68DECLARE@empId INT
69SELECT@empId=EmpId FROM Inserted
70UPDATE EmpPayMent SET Bonus=50.00WHERE EmpID=@empId 71go。