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代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

sqlserver数据库触发器的工作原理

sqlserver数据库触发器的工作原理

SQL Server数据库触发器是一种特殊类型的存储过程,它可以在数据库中的特定事件发生时自动执行。

触发器可以用于监视数据的变化并采取相应的操作,例如插入、更新或删除数据时触发某些业务逻辑。

本文将深入探讨SQL Server数据库触发器的工作原理,包括触发器的类型、创建和使用方法,以及一些最佳实践。

一、触发器的类型SQL Server中有两种类型的触发器:DML触发器和DDL触发器。

1. DML触发器DML触发器(Data Manipulation Language Trigger)是针对数据操作事件的触发器,包括INSERT、UPDATE和DELETE。

当这些事件发生时,DML触发器可以在受影响的表上自动执行相应的逻辑。

DML 触发器可以分为AFTER触发器和INSTEAD OF触发器。

- AFTER触发器:AFTER触发器在数据操作事件完成后触发,可以用于记录日志、更新其他相关表等操作。

- INSTEAD OF触发器:INSTEAD OF触发器可以代替原始的数据操作事件,允许用户在数据操作前执行自定义的逻辑,常用于数据验证和转换。

2. DDL触发器DDL触发器(Data Definition Language Trigger)用于监视数据库结构的变化,包括CREATE、ALTER和DROP等DDL语句的执行。

DDL触发器可以在这些数据库结构变化发生时执行相应的逻辑,如记录变更、阻止某些操作等。

二、触发器的创建和使用要创建触发器,首先需要使用CREATE TRIGGER语句定义并命名一个新触发器,然后指定触发器在哪些事件上触发,以及触发时执行的逻辑。

触发器逻辑通常是一段T-SQL代码,可以包含查询、条件判断、事务控制等操作。

1. 创建DML触发器要创建DML触发器,可以使用如下语法:```CREATE TRIGGER trigger_nameON table_nameAFTER/INSTEAD OF INSERT/UPDATE/DELETEASBEGIN-- trigger logicEND```在这个语法中,trigger_name是触发器的名称,table_name是触发器所在的表,AFTER/INSTEAD OF INSERT/UPDATE/DELETE指定触发的事件,BEGIN和END之间是触发器的逻辑代码。

sqlserver触发器例题

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 触发器示例

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的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。

SQLServer2000编程之触发器

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用触发器记录增删改操作(转载)

sqlserver用触发器记录增删改操作(转载)

sqlserver⽤触发器记录增删改操作(转载)数据库结构:CREATE TABLE[dbo].[cg_tz_log] ([logid]int NOT NULL IDENTITY(1,1) ,operate varchar(10), -- 操作类型如Insert,Update,Delete.id int, -- 原表ID(主键)[cg_date_o] date NULL ,[cg_date_n] date NULL ,[cg_id_o]varchar(255) NULL ,[cg_id_n]varchar(255) NULL ,[cg_sname_o]varchar(255) NULL ,[cg_sname_n]varchar(255) NULL ,[cg_cgpname_o]varchar(255) NULL ,[cg_cgpname_n]varchar(255) NULL ,[cg_ggxh_o]varchar(255) NULL ,[cg_ggxh_n]varchar(255) NULL ,[cg_pp_o]varchar(255) NULL ,[cg_pp_n]varchar(255) NULL ,[cg_num_o]int NULL ,[cg_num_n]int NULL ,[cg_dw_o]varchar(255) NULL ,[cg_dw_n]varchar(255) NULL ,[cg_price_o]money NULL ,[cg_price_n]money NULL ,[cg_priceall_o]money NULL ,[cg_priceall_n]money NULL ,[cg_htprice_o]money NULL ,[cg_htprice_n]money NULL ,[cg_htcbprice_o]money NULL ,[cg_htcbprice_n]money NULL ,[cg_xsht_o]varchar(255) NULL ,[cg_xsht_n]varchar(255) NULL ,[cg_xspname_o]varchar(255) NULL ,[cg_xspname_n]varchar(255) NULL ,[cg_lb_o]varchar(255) NULL ,[cg_lb_n]varchar(255) NULL ,[cg_f_date_o] date NULL ,[cg_f_date_n] date NULL ,[cg_f_percent_o]decimal(38,10) NULL ,[cg_f_percent_n]decimal(38,10) NULL ,[cg_f_price_o]money NULL ,[cg_f_price_n]money NULL ,[cg_nf_price_o]money NULL ,[cg_nf_price_n]money NULL ,[cg_p_id_o]varchar(255) NULL ,[cg_p_id_n]varchar(255) NULL ,[cg_p_price_o]money NULL ,[cg_p_price_n]money NULL ,[cg_dhqk_o]varchar(255) NULL ,[cg_dhqk_n]varchar(255) NULL ,[cg_sphone_o]varchar(255) NULL ,[cg_sphone_n]varchar(255) NULL ,[cg_sfax_o]varchar(255) NULL ,[cg_sfax_n]varchar(255) NULL ,[cg_slxr_o]varchar(255) NULL ,[cg_slxr_n]varchar(255) NULL ,[cg_dh_status_o]int NULL DEFAULT ((0)) ,[cg_dh_status_n]int NULL DEFAULT ((0)) ,[cg_dh_date_o] date NULL DEFAULT ('2017-9-27') ,[cg_dh_date_n] date NULL DEFAULT ('2017-9-27') ,[cg_dhzq_o]int NULL DEFAULT ((30)) ,[cg_dhzq_n]int NULL DEFAULT ((30)) ,[cg_kfid_o]varchar(255) NULL DEFAULT'',[cg_kfid_n]varchar(255) NULL DEFAULT'',spid int not null, -- spidlogin_name varchar(100), -- 登录名prog_name varchar(100), -- 程序名hostname varchar(100), -- 主机名ipaddress varchar(100), -- IP地址runsql varchar(4000), -- 执⾏的TSQL代码UDate datetime-- 操作⽇期时间)GO-- ----------------------------ALTER TABLE[dbo].[cg_tz_log]ADD PRIMARY KEY ([id])GO触发器:-- 建跟踪触发器create trigger tr_cg_tz_logon cg_tz after update,insert,deleteasbegindeclare@di table(et varchar(200),pt varchar(200),ei varchar(max))insert into@di exec('dbcc inputbuffer(@@spid)')declare@op varchar(10)select@op=case when exists(select1from inserted) and exists(select1from deleted)then'Update'when exists(select1from inserted) and not exists(select1from deleted)then'Insert'when not exists(select1from inserted) and exists(select1from deleted)then'Delete'endif@op in('Update','Insert')begininsert into cg_tz_log(operate,id,cg_date_o,cg_date_n,cg_id_o,cg_id_n,cg_sname_o,cg_sname_n,cg_cgpname_o,cg_cgpname_n,cg_ggxh_o,cg_ggxh_n,cg_pp_o,cg_pp_n,cg_num_o,cg_num_n,cg_dw_o,cg_dw_n,cg_price_o,cg_price_n,cg_priceall_o,cg_priceall_n,cg_htprice_o,cg_htprice_n,cg_htcbprice_o,cg_htcbprice_n,cg_xsht_o,cg_xsht_n,cg_xspname_o,cg_xspname_n,cg_lb_o,cg_lb_n,cg_f_date_o,cg_f_date_n,cg_f_percent_o,cg_f_percent_n,cg_f_price_o,cg_f_price_n,cg_nf_price_o,cg_nf_price_n,cg_p_id_o,cg_p_id_n, cg_p_price_o,cg_p_price_n,cg_dhqk_o,cg_dhqk_n,cg_sphone_o,cg_sphone_n,cg_sfax_o,cg_sfax_n,cg_slxr_o,cg_slxr_n,cg_dh_status_o,cg_dh_status_n,cg_dh_date_o,cg_dh_date_n,cg_dhzq_o,cg_dhzq_n,cg_kfid_o,cg_kfid_n,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)select@op,n.id,o.cg_date,n.cg_date,o.cg_id,n.cg_id,o.cg_sname,n.cg_sname,o.cg_cgpname,n.cg_cgpname,o.cg_ggxh,n.cg_ggxh,o.cg_pp,n.cg_pp,o.cg_num,n.cg_num,o.cg_dw,n.cg_dw,o.cg_price,n.cg_price,o.cg_priceall,n.cg_priceall,o.cg_htprice,n.cg_htprice,o.cg_htcbprice,n.cg_htcbprice,o.cg_xsht,n.cg_xsht,o.cg_xspname,n.cg_xspname,o.cg_lb,n.cg_lb,o.cg_f_date,n.cg_f_date,o.cg_f_percent,n.cg_f_percent,o.cg_f_price,n.cg_f_price,o.cg_nf_price,n.cg_nf_price,o.cg_p_id,n.cg_p_id,o.cg_p_price,n.cg_p_price,o.cg_dhqk,n.cg_dhqk,o.cg_sphone,n.cg_sphone,o.cg_sfax,n.cg_sfax,o.cg_slxr,n.cg_slxr,o.cg_dh_status,n.cg_dh_status,o.cg_dh_date,n.cg_dh_date,o.cg_dhzq,n.cg_dhzq,o.cg_kfid,n.cg_kfid,@@spid,(select login_name from sys.dm_exec_sessions where session_id=@@spid),(select program_name from sys.dm_exec_sessions where session_id=@@spid),(select hostname from sys.sysprocesses where spid=@@spid),(select client_net_address from sys.dm_exec_connections where session_id=@@spid),(select top1isnull(ei,'') from@di),getdate()from inserted nleft join deleted o on o.id=n.idendelsebegininsert into cg_tz_log(operate,id,cg_date_o,cg_date_n,cg_id_o,cg_id_n,cg_sname_o,cg_sname_n,cg_cgpname_o,cg_cgpname_n,cg_ggxh_o,cg_ggxh_n,cg_pp_o,cg_pp_n,cg_num_o,cg_num_n,cg_dw_o,cg_dw_n,cg_price_o,cg_price_n,cg_priceall_o,cg_priceall_n,cg_htprice_o,cg_htprice_n,cg_htcbprice_o,cg_htcbprice_n,cg_xsht_o,cg_xsht_n,cg_xspname_o,cg_xspname_n,cg_lb_o,cg_lb_n,cg_f_date_o,cg_f_date_n,cg_f_percent_o,cg_f_percent_n,cg_f_price_o,cg_f_price_n,cg_nf_price_o,cg_nf_price_n,cg_p_id_o,cg_p_id_n, cg_p_price_o,cg_p_price_n,cg_dhqk_o,cg_dhqk_n,cg_sphone_o,cg_sphone_n,cg_sfax_o,cg_sfax_n,cg_slxr_o,cg_slxr_n,cg_dh_status_o,cg_dh_status_n,cg_dh_date_o,cg_dh_date_n,cg_dhzq_o,cg_dhzq_n,cg_kfid_o,cg_kfid_n,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)select@op,o.id,o.cg_date,null,o.cg_id,null,o.cg_sname,null,o.cg_cgpname,null,o.cg_ggxh,null,o.cg_pp,null,o.cg_num,null,o.cg_dw,null,o.cg_price,null,o.cg_priceall,null,o.cg_htprice,null,o.cg_htcbprice,null,o.cg_xsht,null,o.cg_xspname,null,o.cg_lb,null,o.cg_f_date,null,o.cg_f_percent,null,o.cg_f_price,null,o.cg_nf_price,null,o.cg_p_id,null,o.cg_p_price,null,o.cg_dhqk,null,o.cg_sphone,null,o.cg_sfax,null,o.cg_slxr,null,o.cg_dh_status,null,o.cg_dh_date,null,o.cg_dhzq,null,o.cg_kfid,null,@@spid,(select login_name from sys.dm_exec_sessions where session_id=@@spid),(select program_name from sys.dm_exec_sessions where session_id=@@spid),(select hostname from sys.sysprocesses where spid=@@spid),(select client_net_address from sys.dm_exec_connections where session_id=@@spid),(select top1isnull(ei,'') from@di),getdate()from deleted oendendgo。

SQL Server存储过程和触发器操作实训讲义

SQL Server存储过程和触发器操作实训讲义

SQL Server存储过程和触发器操作实训一、由已给数据库文件完成下列SQL存储过程操作1、创建和执行不带参数的存储过程创建一个存储过程p1,返回所有女生信息。

2、创建和执行带参数的存储过程(1)创建一个存储过程p2,返回指定系部的学生信息。

(输入参数)(2)创建从sc表查询指定学生学号的总成绩的存储过程p3。

(输入和输出参数)(3)创建一个名为Query_student的存储过程,该存储过程的功能是根据学号查询学生表中某一学生的姓名、系别、性别及年龄。

(输入参数)执行存储过程Query_student,查询学号为”9512103”的学生的姓名、系别、性别及年龄。

写出完成此功能的SQL命令。

3、创建和执行带输入参数的存储过程(1)创建一个能向学生表中插入一条记录的存储过程Insert_student,该过程需要5个参数,分别用来传递学号、姓名、性别、年龄、系别5个值。

写出执行存储过程Insert_student的SQL语句,向学生表中插入一个新同学,并提供相应的实参值(实参值自定)。

create procedure Insert_student( @no char(10),@name char(8),@sex char(2),@age int,@ dept char(10) )ASbegininsert into s(sno,sname,ssex,sage,sdept)values(@no,@name,@sex,@age,@dept)endEXEC Insert_student @no='9512104', @name='徐小花',@sex='女', @age=20, @dept='计算机系'(2)在课程表中添加“学分”列,类型为小整型,然后创建一个向课程表中插入一门新课程的存储过程Insert_course,该存储过程需要三个参数,分别用来传递课程号、课程名、学分,但允许参数“学分”的默认值为2,即当执行存储过程Insert_course时,未给参数“学分”提供实参值时,存储过程将按默认值2进行运算。

sql server触发器的使用及语法

sql server触发器的使用及语法

sql server触发器的使用及语法SQL Server触发器是一种数据库对象,它可以在指定的表上自动执行程序,以响应特定的数据库事件或操作。

通过使用触发器,可以在不直接修改应用程序代码的情况下,实现对数据库的自动化操作和控制。

本文将介绍SQL Server触发器的使用及其语法。

一、触发器的基本概念触发器是与表相关联的特殊类型的存储过程。

当插入、更新或删除表中的数据时,触发器可以自动执行一系列的操作。

触发器可以用于实现数据的验证、约束和业务逻辑的处理。

它们可以在数据被更改之前或之后触发,以及在每一行被更改之前或之后触发。

二、触发器的创建和使用在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。

语法如下:```CREATE TRIGGER trigger_nameON table_name{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器的逻辑代码END```其中,trigger_name是触发器的名称,table_name是触发器所属的表名,{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}是触发器的触发事件,BEGIN和END之间是触发器的逻辑代码。

三、触发器的类型SQL Server中的触发器可以分为三种类型:INSERT触发器、UPDATE触发器和DELETE触发器。

1. INSERT触发器INSERT触发器在向表中插入新记录之前或之后触发。

可以在INSERT触发器中执行一些额外的逻辑操作,例如记录日志、更新其他表等。

2. UPDATE触发器UPDATE触发器在更新表中的记录之前或之后触发。

可以在UPDATE触发器中进行一些数据验证、约束或业务逻辑处理。

3. DELETE触发器DELETE触发器在从表中删除记录之前或之后触发。

实验6 SQL Server触发器

实验6 SQL Server触发器

课程数据库原理及应用_ 实验名称 SQL Server触发器教师审批签字一.实验目的1、理解触发器的作用和工作机制;2、熟练掌握后触发器和替代触发器的区别;3、熟练掌握后触发器和替代触发器的创建。

二.实验内容及要求对CPXS数据库,完成如下任务:1、插入后触发器的设计和触发在产品销售表建立触发器,进行插入操作,保证产品编号与产品表中的对应字段一致,客户编号与客户表中对应字段一致,保证销售表中主键不能重复。

设计触发器的程序流程,注意给出适当的提示信息。

激发触发器(提示,可以先取消主键和外键约束)。

2、删除后出发期的设计和触发在客户表建立触发器,进行删除操作,保证删除客户记录时,查询销售表中相应的记录,如果销售表中没有相应客户的信息,才允许删除。

设计触发器的程序流程,注意给出适当的提示信息。

激发触发器(提示,可以先取消外键约束)。

3、用约束实现触发器对于内容1的功能,单纯使用约束进行实现。

对于内容2,设计约束,实现删除客户记录的同时,级联删除销售表中相应的记录。

4、设计替代类型触发器,通过视图更新多张表。

创建销售视图,包含字段(产品编号,产品名称, 客户编号,客户名称, 销售日期,数量,销售额)。

对视图设计更新操作的替代触发器,更新视图的同时,更新产品、客户、销售三张表。

三.实验过程及结果(实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。

)1.USE CPXSGOCREATE TRIGGER tri_inserton销售for insertasbegindeclare @cpnum char(6)set @cpnum=(select inserted.产品编号from inserted)declare @cmnum char(6)set @cmnum=(select inserted.客户编号from inserted)if(@cpnum not in(select产品编号from产品))beginprint'插入数据中产品编号和产品表中的不一致,插入失败'print @cpnumrollbackendelse if(@cmnum not in(select客户编号from客户))beginprint'插入数据中客户编号和客户表中的不一致,插入失败'print @cmnumrollbackendelseprint'插入成功!'end验证:insert into销售values('s00002','c0002','2001.02.24',45,33333)2.USE CPXSGOCREATE TRIGGER Tri_Cus_Delon客户for deleteasbegindeclare @cmnum char(6)set @cmnum=(select deleted.客户编号from deleted)if(@cmnum is null)beginprint'该客户不存在,删除失败'endelse if(@cmnum in(select客户编号from销售))beginprint'销售表中存在该用户的记录,删除失败'print'客户编号为'+@cmnumrollbackendelseprint'删除成功'+'客户编号为:'+@cmnumend验证:delete from客户where客户编号='c00001'3.(1)USE CPXSGOCREATE TRIGGER tri_inserton销售for insertasbegindeclare @cpnum char(6)set @cpnum=(select inserted.产品编号from inserted)declare @cmnum char(6)set @cmnum=(select inserted.客户编号from inserted)if(@cpnum not in(select产品编号from产品))beginprint'插入数据中产品编号和产品表中的不一致,插入失败'print @cpnumrollbackendelse if(@cmnum not in(select客户编号from客户))beginprint'插入数据中客户编号和客户表中的不一致,插入失败'print @cmnumrollbackendelseprint'插入成功!'end验证:insert into销售values('s00002','c0002','2001.02.24',45,33333)(2)USE CPXSGOCREATE TRIGGER tri_reson客户for insert,deleteasbegindeclare @cmnum char(6)set @cmnum=(select deleted.客户编号from deleted)if(@cmnum is null)beginprint'该客户不存在,删除失败'endelse if(@cmnum in(select客户编号from销售))beginprint'销售表中存在该用户的记录,级联删除销售表中数据'print'客户编号为'+@cmnumdelete from销售where客户编号=@cmnumendelseprint'删除成功'+'客户编号为:'+@cmnumend验证:delete from客户where客户编号='c00001'select*from客户select*from销售4.USE CPXSGOCREATE VIEW view_sellASSELECT A.产品编号,A.产品名称,B.客户编号,B.客户名称,C.销售日期,C.数量,c.销售额FROM dbo.产品 A,dbo.客户 B,dbo.销售 CWHERE A.产品编号=C.产品编号AND B.客户编号=C.客户编号create trigger tri_tidaion view_sellinstead of updateasSET NOCOUNT ONdeclare @cp_num_in char(6)set @cp_num_in=(select inserted.产品编号from inserted)declare @cp_num_del char(6)set @cp_num_del=(select deleted.产品编号from deleted)declare @cp_name_in varchar(30)set @cp_name_in=(select inserted.产品名称from inserted)declare @cp_name_del varchar(30)set @cp_name_del=(select deleted.产品名称from deleted)declare @cm_num_in char(6)set @cm_num_in=(select inserted.客户编号from inserted)declare @cm_num_del char(6)set @cm_num_del=(select deleted.客户编号from deleted)declare @cm_name_in varchar(30)set @cm_name_in=(select inserted.客户名称from inserted)declare @cm_name_del varchar(30)set @cm_name_del=(select deleted.客户名称from deleted)declare @date datetimeset @date=(select inserted.销售日期from inserted)declare @amount intset @amount=(select inserted.数量from inserted)declare @sale decimalset @sale=(select inserted.销售额from inserted)update产品set产品名称=@cp_name_inwhere产品名称=@cp_name_delupdate产品set产品编号=@cp_num_inwhere产品编号=@cp_num_delupdate客户set客户编号=@cm_num_inwhere客户编号=@cm_num_delupdate客户set客户名称=@cm_name_inwhere客户名称=@cm_name_delupdate销售set销售日期=@date,数量=@amount,销售额=@salewhere产品编号=@cp_num_del and客户编号=@cm_num_del 验证:update view_sell set客户名称='客户M',产品名称='iPhone4s',销售日期='',数量=2,销售额='10000'where产品编号='s00001'and客户编号='c00002'select*from dbo.view_sellorder by产品编号select*from dbo.产品order by产品编号select*from dbo.客户order by客户编号select*from dbo.销售order by产品编号四.实验中的问题及心得经过这次试验让我更深入的了解到触发器的用途以及触发器的使用,刚开始不知道从何出下手,最后查书才搞明白如何解决,通过努力解决这几道题,让我明白如何实现触发器的定义,以及对一些事件的处理过程,如何对表和视图进行创建触发器,以及如何完成相关的级联操作,虽然花费了不少时间,但很有收获。

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触发器

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触发器实现数据表的级联更新-最新资料使用SQL Server触发器实现数据表的级联更新0 引言数据库完整性就是保证数据库中数据的正确性和一致性。

其中正确性指数据要符合语义规范,数据定义在规范的有效范围内;一致性是指数据库中所表示的同一事物的数据应当一致。

在SQL Server中数据库完整性主要有约束来定义,约束定义了必须遵循的用于维护数据一致性和正确性的有效性规则。

简单的完整性要求可以在定义基本表时通过创建约束来实现,但如果想要实现更为复杂的数据完整性要求,比如依据数据表的变化实现数据的自动级联更新等,这就需要用触发器来完成了。

本文浅析了在 SQL Server中通过触发器实现数据库完整性的原理,并结合一个实例分析了使用触发器实现级联更新的一般过程。

1 触发器概述及其工作原理触发器是SQL Server数据库的重要工具,可以被看作是一种特殊的存储过程。

一般的存储过程通过存储过程名称被调用执行,而触发器是通过数据库事件的触发而被执行,在对触发器所监控的表执行添加、修改或删除操作时触发器被触发。

触发器的过程体中可以包含复杂的SQL语句,因此触发器可以实现比约束更加复杂的数据完整性要求。

在 SQL Server 2005 中有两种触发器: DDL触发器和 DML 触发器。

DDL触发器是被数据定义语句(DDL)所触发而被调用的触发器;DML触发器是被数据操作语句(DML)所触发而被调用的触发器。

数据完整性规则主要由DML 触发器创建,因此本文主要讨论DML触发器。

由于触发器被激活后所执行的操作不同,SQL Server中包含两种触发方式: After触发方式和Instead Of触发方式。

After触发方式是比较常用的触发方式(另有一种For触发方式与After相同,是为与 SQL Server 早期版本兼容的可选项),这种触发方式的触发器在进行数据操作以后被触发,先执行了触发语句(插入、更新、删除),然后执行了触发器。

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触发器实现跨库同步(转)

SQLSERVER触发器实现跨库同步(转)

SQLSERVER触发器实现跨库同步(转)/*--同步两个数据库的⽰例有数据srv1.库名..author有字段:id,name,phone,srv2.库名..author有字段:id,name,telphone,adress要求:srv1.库名..author增加记录则srv1.库名..author记录增加srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新--*/--⼤致的处理步骤--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip'exec sp_addlinkedsrvlogin 'srv2','false',null,'⽤户名','密码'go--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为⾃动启动我的电脑--控制⾯板--管理⼯具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为⾃动启动go--3.实现同步处理--a.在srv1..author中创建触发器,实现数据即时同步--新增同步create trigger tr_insert_author on authorfor insertasset xact_abort oninsert srv2.库名.dbo.author(id,name,telphone)select id,name,telphone from insertedgo--修改同步create trigger tr_update_author on authorfor updateasset xact_abort onupdate b set name=,telphone=i.telphonefrom srv2.库名.dbo.author b,inserted iwhere b.id=i.idgo--删除同步create trigger tr_delete_author on authorfor deleteasset xact_abort ondelete bfrom srv2.库名.dbo.author b,deleted dwhere b.id=d.idgo--3.实现同步处理的⽅法2,定时同步--在srv1中创建如下的同步处理存储过程create proc p_processas--更新修改过的数据update b set name=,telphone=i.telphonefrom srv2.库名.dbo.author b,author iwhere b.id=i.id and(<> or b.telphone<>i.telphone)--插⼊新增的数据insert srv2.库名.dbo.author(id,name,telphone)select id,name,telphone from author iwhere not exists(select*from srv2.库名.dbo.author where id=i.id)--删除已经删除的数据(如果需要的话)delete bfrom srv2.库名.dbo.author bwhere not exists(select*from author where id=b.id)go--然后创建⼀个作业定时调⽤上⾯的同步处理存储过程就⾏了企业管理器--管理--SQL Server代理--右键作业--新建作业--"常规"项中输⼊作业名称--"步骤"项--新建--"步骤名"中输⼊步骤名--"类型"中选择"Transact-SQL 脚本(TSQL)"--"数据库"选择执⾏命令的数据库--"命令"中输⼊要执⾏的语句: exec p_process--确定--"调度"项--新建调度--"名称"中输⼊调度名称--"调度类型"中选择你的作业执⾏安排--如果选择"反复出现"--点"更改"来设置你的时间安排然后将SQL Agent服务启动,并设置为⾃动启动,否则你的作业不会被执⾏设置⽅法:我的电脑--控制⾯板--管理⼯具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"⾃动启动"--确定.上⾯写了两种同步⽅法,实际使⽤时,只需要其中任意⼀种就⾏了如果数据库在同⼀实例中,则只需要同步处理的部分,并且将处理语句中涉及到的服务器名去掉,即只要:库名.dbo.表名如果只是简单的数据同步,可以⽤触发器来实现.下⾯是例⼦:--测试环境:SQL2000,远程主机名:xz,⽤户名:sa,密码:⽆,数据库名:test--创建测试表,不能⽤标识列做主键,因为不能进⾏正常更新--在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器if exists (select*from dbo.sysobjects where id =object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') =1)drop table[test]create table test(id int not null constraint PK_test primary key,name varchar(10))go--创建同步的触发器create trigger t_test on testfor insert,update,deleteasset XACT_ABORT on--启动远程服务器的MSDTC服务exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output--启动本机的MSDTC服务exec master..xp_cmdshell 'net start msdtc',no_output--进⾏分布事务处理,如果表⽤标识列做主键,⽤下⾯的⽅法BEGIN DISTRIBUTED TRANSACTIONdelete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)where id in(select id from deleted)insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)select*from insertedcommit trango--插⼊数据测试insert into testselect1,'aa'union all select2,'bb'union all select3,'c'union all select4,'dd'union all select5,'ab'union all select6,'bc'union all select7,'ddd'--删除数据测试delete from test where id in(1,4,6)--更新数据测试update test set name=name+'_123'where id in(3,5)--显⽰测试的结果select*from test a full joinopenrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id如何实现两个数据库的同步利⽤数据库复制技术实现数据同步更新复制的概念复制是将⼀组数据从⼀个数据源拷贝到多个数据源的技术,是将⼀份数据发布到多个存储站点上的有效⽅式。

SQLSERVER函数-存储过程-触发器

SQLSERVER函数-存储过程-触发器
二、触发器
触发器分类:(1) “Instead of”触发器(2)“After”触发器 “Instead of”触发器:在执行操作之前被执行 “After”触发器:在执行操作之后被执行
触发器中后面的案例中需要用到的表及测试数据如下:
--部门 create table Department (
DepartmentId varchar(10) primary key , --主键,自动增长 DepartmentName nvarchar(50), --部门名称 ) --人员信息 create table People ( PeopleId int primary key identity(1,1), --主键,自动增长 DepartmentId varchar(10), --部门编号,外键,与部门表关联
函数定义:
create function GetAgeByBirth(@birth smalldatetime) returns int as begin
declare @age int set @age = year(getdate()) - year(@birth) if month(getdate()) < month(@birth)
函数调用实现查询功能
select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, dbo.GetGradeByMoney(CardMoney) 账户等级,dbo.GetStatusByNumber(CardState) 卡状态 from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId

sqlserver的触发器练习实例

sqlserver的触发器练习实例

sqlserver的触发器练习实例触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发⽣了,就会做⼀些⼯作。

下⾯直接上⼲货,创建insert触发器、delete触发器、DDL触发器和如何查看触发器定义1.创建三个表学⽣表、班级表、课程表create database student_scoreGO--在数据库中创建三个表学⽣表、班级表、课程表的结构use student_scoreGOcreate table student( stu_id char(8) primary key,stu_name char(10),stu_sex char(2),stu_birthday smalldatetime,class_id char(6))gocreate table class( class_id char(6) primary key,class_name varchar(30),class_num int,)create table course( course_id char(3) primary key,course_name varchar(30),)gocreate table score( stu_id char(8),course_id char(3),score int check(score>=0 and score<=100)primary key(stu_id,course_id))go2.插⼊⽤例数据--往表中插⼊数据(student,course,score)insert into student values('0601001','李⽟','⼥','1987-05-06', '0601')insert into student values('0601002','鲁敏','⼥','1988-06-28', '0601')insert into student values('0601003','李⼩路','⼥','1987-01-08', '0601')insert into student values('0601004','鲁斌','男','1988-04-21', '0601')insert into student values('0601005','王宁静','⼥','1986-05-29', '0601')insert into student values('0601006','张明明','男','1987-02-24', '0601')insert into student values('0601007','刘晓玲','⼥','1988-12-21', '0601')insert into student values('0601008','周晓','男','1986-04-27', '0601')insert into student values('0601009','易国梁','男','1985-11-26', '0601')insert into student values('0601010','季风','男','1986-09-21', '0601')insert into class values('0501','计算机办公应⽤', 40)insert into class values('0502','⽹络构建', 43)insert into class values('0503','图形图像', 48)insert into class values('0601','可视化', 41)insert into class values('0602','数据库', 38)insert into class values('0603','⽹络管理', 45)insert into class values('0604','多媒体', 40)insert into class values('0701','计算机办公应⽤', 39)insert into class values('0702','WEB应⽤', 38)insert into class values('0703','⽹络构建', 40)insert into course values('001','计算机应⽤基础')insert into course values('002','关系数据基础')insert into course values('003','程序设计基础')insert into course values('004','数据结构')insert into course values('005','⽹页设计')insert into course values('006','⽹站设计')insert into course values('007','SQL Server 2000关系数据库')insert into course values('008','SQL Server 2000程序设计')insert into course values('009','计算机⽹络')insert into course values('010','Windows Server 配置')insert into score values('0601001','001',78)insert into score values('0601002','001',88)insert into score values('0601003','001',65)insert into score values('0601004','001',76)insert into score values('0601005','001',56)insert into score values('0601006','001',87)insert into score values('0601007','001',67)insert into score values('0601008','001',95)insert into score values('0601009','001',98)insert into score values('0601010','001',45)insert into score values('0601001','002',48)insert into score values('0601002','002',68)insert into score values('0601003','002',95)insert into score values('0601004','002',86)insert into score values('0601005','002',76)insert into score values('0601006','002',57)insert into score values('0601007','002',77)insert into score values('0601008','002',85)insert into score values('0601009','002',98)insert into score values('0601010','002',75)insert into score values('0601001','003',88)insert into score values('0601002','003',78)insert into score values('0601003','003',65)insert into score values('0601004','003',56)insert into score values('0601005','003',96)insert into score values('0601006','003',87)insert into score values('0601007','003',77)insert into score values('0601008','003',65)insert into score values('0601009','003',98)insert into score values('0601010','003',75)insert into score values('0601001','004',74)insert into score values('0601002','004',68)insert into score values('0601003','004',95)insert into score values('0601004','004',86)insert into score values('0601005','004',76)insert into score values('0601006','004',67)insert into score values('0601007','004',77)insert into score values('0601008','004',85)insert into score values('0601009','004',98)insert into score values('0601010','004',75)insert into score values('0601001','005',74)insert into score values('0601002','005',68)insert into score values('0601005','005',76)insert into score values('0601008','005',85)insert into score values('0601009','005',98)insert into score values('0601010','005',75)insert into score values('0601002','006',88)insert into score values('0601003','006',95)insert into score values('0601006','006',77)insert into score values('0601008','006',85)insert into score values('0601010','006',55)insert into score values('0601001','007',84)insert into score values('0601002','007',68)insert into score values('0601003','007',95)insert into score values('0601004','008',86)insert into score values('0601005','008',76)insert into score values('0601006','008',67)insert into score values('0601007','009',67)insert into score values('0601008','009',85)insert into score values('0601009','010',98)insert into score values('0601010','010',75)3.练习实例--1)在student上创建INSERT触发器stu_insert,要求在student表中插⼊记录时(要求每次只能插⼊⼀条记录),这个触发器都将更新class表中的class_nun列。

数据库开发-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 表中插入一条日志信息。

SQL SERVER数据库开发之触发器的应用

SQL SERVER数据库开发之触发器的应用

SQL SERVER数据库开发之触发器的应用不知道在坛子里有多少朋友使用触发器,如果你已经对触发器很了解了,那么请跳过此文,如果你还没有使用过触发器的话,那就让我们来认识一下吧。

引用:定义:触发器是一种特殊类型的存储过程,不由用户直接调用。

当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。

触发器可以查询其它表,而且可以包含复杂的 SQL 语句。

它们主要用于强制复杂的业务规则或要求。

触发器一个应用就是保持和维护数据的完整性及合法性,那么怎么来理解呢?就是说你可以在程序里提交任意数据,然后由触发器来判断数据的完整性及合法性,当然这里只是举例说明,实际应用中不推荐这样用,应该由应用程序来验证数据的完整性及合法性。

下面我还是以实例的方式来描述触发器的应用。

设:当前数据库中有“uMateriel”和“uRecord”两张表,他们分别用来保存物品信息和物品的出入库记录信息,结构如下引用:uMateriel----------------mId intmName nvarchar(40)mNum int DEFAULT 0uRecord----------------rId intmId intrNum intrDate datetime DEFAULT GetDate()rMode bit DEFAULT 0好了,数据表已经有了,现在看一下实际的应用。

现在,我们要购入物品A,数量100,时间为当天,已知物品A的编号为1,那么通常我们需要做以下两个步骤:引用:1、在 uRecord 记录表中增加一条物品A的购入记录:INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)2、更新 uMateriel 物品库存表中物品A的数量:UPDATE uMateriel SET mNum = mNum + 100 WHERE mId=1也就是说代码中要先后处理以上两条语句,才能保证库存的准确性,以ASP 代码为例:引用:On Error Resume Next'// 设 adoConn 为已经连接的 ADODB.Connection 对象With adoConn'// 事务开始,因为涉及到多步数据更新操作,所以在这里使用事务 .BeginTrans'// 插入物品入库记录.Execute("INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)")'// 更新物品库存记录.Execute("UPDATE uMateriel SET mNum = mNum + 100 WHERE mId=1")'// 判断是否产生了错误If Err.Number <> 0 Then'// 如果有错误,事务回滚.RollbackTransResponse.Write "错误!"Err.ClearElse'// 如果没有错误,则提交事务.CommitTransEnd IfEnd With以上代码可以更新一条入库记录了,但是我们今天要了解的是触发器的应用,那么要在触发器里写什么内容可以简化以上代码呢?下面来创建一个触发器。

sqlserver触发器insert,delete,update

sqlserver触发器insert,delete,update

NULL ,
GETDATE() ,
NULL ,
GETDATE()
FROM Inserted AS A
INNER JOIN LM_SYS_ShiYanShiXinXi AS B ON A.ShiYanShiID = B.ShiYanShiID
INNER JOIN LM_MJ_Men AS C ON B.MenID = C.MenID WHERE A.ShiFouMoRen = 0
请求出错错误代码503请尝试刷新页面重试
sqlserver触发器 insert,delete,update
-- =============================王伟
-- Create date: 2017-07-06
-- Description: 增、删、改开放时间表时,同步数据至考勤安排表
-- =============================================
CREATE TRIGGER [dbo].[TR_LM_SYS_KaiFangShiJian_IDU]
ON [dbo].[LM_SYS_KaiFangShiJian]
FOR INSERT,DELETE,UPDATE
AS
BEGIN
--新增
if(exists(select 1 from inserted) and not exists(select 1 from deleted))
begin
INSERT INTO LM_KQ_KaoQingAnPai
( KaoQingAnPaiID ,
ShiYanShiID ,
KaiShiRiQi ,
CONVERT(VARCHAR(100), A.ShiYanShiID) AS ShiYanShiID , A.KaiShiRiQi , A.JieShuRiQi ,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

一、Trigger语法:
create trigger tr_name
on 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 ,inserted
deleted 和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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以用到触发器。

对于1,创建一个Update触发器:
Create Trigger truStudent
On Student --在Student表中创建触发器
for Update --为什么事件触发
As --事件触发后所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表
Where br.StudentID=d.StudentID
end
理解触发器里面的两个临时的表:Deleted , Inserted 。

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

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

对于2,创建一个Delete触发器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
对于3,创建一个Insert触发器
create Trigger testdb
on myStudent
for insert
as
begin
insert into BorrowRecord(StudentID,Sex) select studentid,username from inserted myStudent
end
从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。

相关文档
最新文档