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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
sql server触发器的基本语法和使用方法
sql server触发器的基本语法和使用方法一、引言SQL Server触发器是一种数据库对象,它在数据库表上定义在特定事件发生时自动执行的操作。
触发器基于定义的事件和条件进行触发,并执行一系列预定的操作。
本文将介绍SQL Server触发器的基本语法和使用方法,帮助您更好地理解和应用触发器。
二、触发器的语法触发器的语法主要由以下几个部分组成:1. 触发器名称:指定触发器的名称,以便在创建触发器时进行命名和识别。
2. 触发器事件:指定触发器应何时触发,常见的触发器事件包括INSERT、UPDATE和DELETE等。
3. 触发器模式:指定触发器在事件发生时执行的操作,包括对表数据的插入、更新和删除等操作。
4. 触发器所在的架构:指定触发器所在的架构,以便在创建触发器时指定正确的架构。
基本语法示例:CREATE TRIGGER trigger_name ON table_name FOR INSERT, UPDATE, DELETE AS BEGIN -- 触发器操作代码 END;三、触发器的使用方法1. 创建触发器:使用CREATE TRIGGER语句创建触发器,指定触发器的名称、事件、模式和所在的架构。
2. 禁用和启用触发器:使用ALTER TRIGGER语句来禁用和启用触发器,以满足特定需求或临时更改触发器的行为。
3. 修改触发器:使用ALTER TRIGGER语句修改现有触发器的名称、事件、模式和位置等属性。
4. 删除触发器:使用DROP TRIGGER语句删除不再需要的触发器。
5. 触发器的嵌套:在触发器内部可以定义其他触发器,形成嵌套结构,实现更复杂的逻辑。
6. 触发器的权限:确保创建、修改和删除触发器的用户具有足够的权限。
7. 异常处理:在触发器操作代码中添加适当的异常处理机制,以应对可能出现的错误和异常情况。
四、示例以下是一个简单的示例,展示如何使用SQL Server触发器在表上定义一个插入操作时自动添加日志:1. 创建表:首先创建一个包含要记录的字段的表。
sqlserver 触发器判断条件
在SQL Server 中,触发器(Trigger)是一种特殊的存储过程,它会在特定的数据修改操作(如INSERT、UPDATE 或DELETE)发生时自动执行。
你可以使用触发器来执行各种任务,如验证数据、执行审计、确保数据完整性等。
在触发器中,你可以使用 INSERTED 和 DELETED 这两个特殊的表来访问被修改的数据。
INSERTED 表包含新插入或修改后的数据,而 DELETED 表包含被删除或修改前的数据。
以下是一个简单的例子,展示了如何在触发器中使用条件判断:
假设我们有一个名为 Employees 的表,我们想在每次插入新员工时检查其工资是否低于某个值(例如2000)。
如果是,则触发器会阻止这次插入操作。
在上述触发器中,我们使用了 INSERTED 表来访问新插入的数据,并使用 ROLLBACK TRANSACTION 来撤销这次插入操作。
我们还使用了 RAISERROR 来抛出一个错误消息,告诉用户为什么插入操作被阻止。
sqlserver中数据增删改 触发器写法
SQL Server是一种关系型数据库管理系统,用于在计算机和服务器上存储和检索数据。
在SQL Server中,数据的增删改操作是非常常见的,而触发器则是一种在数据库中定义的特殊的存储过程,它可以在数据被修改时自动执行。
本文将介绍SQL Server中数据增删改触发器的写法并提供实例演示。
一、触发器的基本概念1.1 触发器定义触发器是一种与表相关的数据库对象,它会在表上插入、更新或删除数据时自动执行。
1.2 触发器分类在SQL Server中,触发器分为INSERT触发器、UPDATE触发器和DELETE触发器,分别表示在数据插入、更新和删除操作时触发执行。
二、触发器的创建与使用2.1 创建触发器在SQL Server中,可以使用CREATE TRIGGER语句创建一个触发器,语法如下:```sqlCREATE TRIGGER trigger_nameON table_nameAFTER INSERT, UPDATE, DELETEASBEGIN-- 触发器执行的逻辑END```2.2 触发器的执行时机在创建触发器时,需要指定触发器执行的时机,包括AFTER和INSTEAD OF两种选项。
AFTER表示在数据操作之后执行触发器逻辑,而INSTEAD OF表示在数据操作之前执行触发器逻辑。
2.3 触发器的使用一旦创建了触发器,它会在指定的操作发生时自动执行,无需手动调用触发器。
三、触发器的编写实例下面我们以一个实际的案例,演示如何在SQL Server中编写数据增删改触发器。
3.1 创建测试表我们创建一个测试表TestTable,用于存储测试数据,表结构如下:```sqlCREATE TABLE TestTable(ID INT PRIMARY KEY,Name NVARCHAR(50))```3.2 创建INSERT触发器接下来,我们创建一个INSERT触发器,当往TestTable表中插入数据时,自动将数据插入到另一个备份表BackupTable中。
sql server触发器的使用及语法
SQL Server触发器是一种特殊的数据库对象,它可以在表上定义,用于在特定的数据操作(如插入、更新、删除)发生时自动执行一段代码。
触发器可以用于实现数据约束、数据审计、数据变更记录等功能。
以下是SQL Server触发器的使用及语法:.创建触发器:CREATE TRIGGER trigger_name{AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name[WITH ENCRYPTION][FOR | AFTER] {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器执行的代码END.删除触发器:DROP TRIGGER [schema_name.]trigger_name.触发器的类型:•AFTER触发器:在数据操作之后触发执行。
•INSTEAD OF触发器:在数据操作之前触发执行,可以替代原始操作。
.触发器的事件:•INSERT:在向表中插入数据时触发。
•UPDATE:在更新表中的数据时触发。
•DELETE:在从表中删除数据时触发。
.触发器的执行时间:•FOR:在数据操作之前或之后触发执行。
•AFTER:在数据操作之后触发执行。
触发器的代码:触发器的代码可以包含SQL语句、存储过程、函数等。
可以使用INSERTED和DELETED临时表来访问触发器操作的数据。
INSERTED表包含已插入或已更新的数据,DELETED表包含已删除或已更新的数据。
触发器的加密:使用WITH ENCRYPTION选项可以对触发器的定义进行加密,防止他人查看触发器的代码。
需要注意的是,触发器的使用应该谨慎,过多或复杂的触发器可能会影响数据库的性能。
在设计和使用触发器时,要考虑到对数据库性能的影响,并经过充分测试和优化。
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触发器触发INSERT,UPDATE,DELETE三种状态
SQLSERVER触发器触发INSERT,UPDATE,DELETE三种状态SQLSERVER触发器触发INSERT,UPDATE,DELETE三种状态来源:⼀个触发器内三种INSERT,UPDATE,DELETE状态CREATE TRIGGER tr_T_A ON T_A for INSERT,UPDATE,DELETE如IF exists (select * from inserted) and not exists (select * from deleted) 则为 INSERT如IF exists(select * from inserted ) and exists (select * from deleted) 则为 UPDATE如IF exists (select * from deleted) and not exists (select * from inserted)则为 DELETE插⼊操作(Insert):Inserted表有数据,Deleted表⽆数据删除操作(Delete):Inserted表⽆数据,Deleted表有数据更新操作(Update):Inserted表有数据(新数据),Deleted表有数据(旧数据)---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL中触发器的使⽤原⽂地址:https:///feiquan/archive/2018/04/01/8685722.html创建触发器是特殊的存储过程,⾃动执⾏,⼀般不要有返回值类型: 1.后触发器(AFTER,FOR)先执⾏对应语句,后执⾏触发器中的语句 2.前触发器并没有真正的执⾏触发语句(insert,update,delete),⽽是执⾏触发后的语句 3.⾏级触发器(FOR EACH ROW)在SQL server 中不存在商品号为1的库存量:1.后触发器(实现不同表之间的约束)--实现在销售量不⼤于库存量时,每卖出n件商品,对应商品的库存要减n,若销售量⼤于库存量,则回滚此次操作IF EXISTS (SELECT *FROM sysobjects WHERE name='tr_SaleCommodity')DROP TRIGGER tr_SaleCommodityGOCREATE TRIGGER tr_SaleCommodityON OrderInfo FOR INSERT --FOR/AFTER为后触发器ASBEGINIF EXISTS (SELECT * FROM inserted I INNER JOIN CommodityInfo C ON modityId=modityIdWHERE I.Amount>C.Amount)BEGINROLLBACK --后触发器PRINT '商品的销售量⼤于商品的库存量'ENDELSEBEGINUPDATE CommodityInfoSET Amount=Amount-(SELECT Amount FROM inserted)WHERE CommodityId IN(SELECT CommodityId FROM inserted)ENDENDGO执⾏:INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)VALUES('YOUYOU',1,10,600,'⽹上银⾏','2014-11-11 00:00:00.000',1,1)结果: 注意:1.上⼀⾏为销售记录,下⼀⾏为商品1的信息 2.卖出10个,库存量由48变为38 3.可以看出以上的销售记录中的Paymoney是不正确的,它的值应该是Amount*OutPrice=10*300,所以需要前触发器来约束2.前触发器(可以实现⾏级触发器功能)--实现了⽇期校验和⽀付⾦额的计算IF EXISTS(SELECT* FROM sysobjects WHERE name='tr_DateConfim')DROP TRIGGER tr_DateConfimGOCREATE TRIGGER tr_DateConfimON OrderInfo INSTEAD OF INSERT ,UPDATEASBEGINDECLARE @date datetimeSELECT @date=OrderTime FROM insertedIF @date BETWEEN '2012-1-1' AND '2015-1-1'BEGINDECLARE @UserId varchar(20) ,@CommodityId int,@Amount int,@PayMoney money,@PayWay varchar(20),@OrderTime datetime,@Confirm int,@SendGoods intSELECT @UserId=UserId,@CommodityId=CommodityId,@Amount=Amount,@PayWay=PayWay,@OrderTime=OrderTime,@Confirm=Confirm,@SendGoods=SendGoods FROM insertedDECLARE @outPrice moneySELECT @outPrice=OutPrice FROM CommodityInfo WHERE CommodityId=@CommodityIdSET @PayMoney=@outPrice*@AmountPRINT 'inserted 中的数据:'+CONVERT(varchar(20),@UserId)+' '+CONVERT(varchar(20),@CommodityId)+' '+CONVERT(varchar(20),@Amount)+' '+CONVERT(varchar(20),@PayMoney)+' '+CONVERT(varchar(20),@PayWay)+' '+CON INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)SELECT UserId,CommodityId,Amount,@PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM insertedENDELSEPRINT '你插⼊的数据中的时间只能在 2012-1-1 到 2015-1-1 中间'ENDGO执⾏:INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayWay,OrderTime,Confirm,SendGoods)VALUES('YOUYOU',1,5,'⽹上银⾏','2013-1-11',1,1) 注意:这⾥插⼊时我并没有定义PayMoney,PayMoney是通过触发器来⾃动计算的结果:⽇期不正确:⽇期正确:打印信息对应:@UserId+' '+@CommodityId+' '+@Amount+' '+@PayMoney+' '+@PayWay+' '@OrderTime+' '@Confirm+' '+@SendGoods+' '@outPrice3.⾏级触发器(错误)执⾏结果:可以看出在SQL server中并不⽀持⾏级触发器。
SqlServer触发器实现自动编号
触发器做个实现数据插入表时自动编号的功能,详细出处参考:/article/31031.htm总结常用基本点如下:1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML 触发器)。
DDL触发器:在用户对数据库执行数据定义(CREATE、ALTER、DROP或相似的语句)对数据库结构进行修改时激活而做出响应。
DML触发器:在用户对数据库执行数据操作时发生,触发器中的代码会被自动调用。
2、DML触发器分类:Insert触发器、Delete触发器、Update触发器、上面任意类型混合。
3、触发器创建语法:复制代码代码如下:CREATE TRIGGER <trigger name>ON <table or view>{{{FOR|AFTER} <[INSERT] [,] [UPDATE],[DELETE]>}|INSTEAN OF}AS<sql statement>4、触发器必须附加到表或视图上,触发器不能单独存在。
AFTER或FOR触发器不支持视图,INSTEAD OF支持表或视图。
5、INSERT触发器中,SQL Server 会创建一个插入行的副本,并把该副本插入到一个特殊表Insert表中,该表只在触发器作用域内存在。
6、DELETE触发器中,SQL Server 会创建一个删除行的副本,并把该副本插入到一个特殊表Delete表中,该表只在触发器作用域内存在。
7、UPDATE触发器中,SQL Server认为更新的记录是删除了现有的记录,插入更新后的新纪录,所以UPDA TE触发器中包含Insert和Delete两个特殊表,也是只存在触发器作用域内,这两个表的行数完全一样。
8、触发器尽可能简短,因为触发器和触发器内的语句被一同处理,即直到语句执行完成才算是触发器完成。
如果代码很长那触发器运行时间就会很长。
下面是个实现自动编号功能的例子:--有两张表,客户表和项目表,要求:新建项目时自动生成项目编号,每个不同的客户的项目的编号从1开始--项目编号格式为PJ+"-"+"客户编号"+"-"+"日期"+"-"+"流水号"--如项目编号:PJ-ABCD-120805-0001create table testAccount --创建测试客户表(tAccName nvarchar(100), --客户姓名tAccId nvarchar(32) --客户编号)create table testProject --创建测试项目表(tProName nvarchar(100), --项目名称tProId nvarchar(32), --项目编号tIdAcc nvarchar(100), --客户编号tProGuid nvarchar(64) --guid)gocreate trigger T_AutoNumberon testProjectafter insertasbegindeclare @one nvarchar(8), --编号第一部分,PJ@two nvarchar(32), --编号第二部分,客户编号@three nvarchar(8), --编号第三部分,日期@four int, --编号第四部分,流水号@guid nvarchar(64) --guidset @one='PJ'set @three= convert( varchar(8),GETDA TE(),112)--从Inserted副本表里获取当前插入数据的客户编码和guidselect @two=tIdAcc,@guid=tProGuid from Inserted--获取编号最后四位select @four=max(cast(right(tProId,4)as int))from testProjectwhere tIdAcc=@two--对每一个新客户的流水号都是从1开始,已存在客户为最大流水号加1if @four is nullset @four=0elseset @four=cast(@four as int)set @four=@four+1update testProject set tProId=@one+'-'+@two+'-'+@three+'-'+right('0000'+cast(@four as varchar),4) where tProGuid=@guidendgo--生成测试表数据insert into testAccount values ('小小鸭有限公司','XXYGS')insert into testAccount values ('丑小鸭有限公司','CXY')insert into testProject (tProName,tIdAcc,tProGuid)values ('小鸭成长项目','XXYGS',newid()) insert into testProject (tProName,tIdAcc,tProGuid)values ('小鸭学游泳项目','XXYGS',newid()) insert into testProject (tProName,tIdAcc,tProGuid)values ('丑小鸭成长项目','CXY',newid()) select * from testProjectdrop table testAccountdrop table testProject。
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 操作执行不同的操作。
sqlserver触发器中获取触发触发器的这条sql语句
sqlserver触发器中获取触发触发器的这条sql语句
在SQL Server 中,你可以在触发器中使用CONTEXT_INFO()函数来获取触发触发器的SQL 语句。
CONTEXT_INFO()函数返回一个varbinary类型的值,该值包含了触发器执行的上下文信息。
以下是一个示例,演示如何在触发器中使用CONTEXT_INFO()函数来获取触发触发器的SQL 语句:
sql
CREATE TRIGGER MyTrigger
ON MyTable
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE@sql NVARCHAR(MAX);
SET@sql = CAST(CONTEXT_INFO() AS NVARCHAR(MAX));
PRINT @sql; -- 打印触发器执行的 SQL 语句
END;
在上述示例中,MyTrigger是触发器的名称,MyTable是触发器所在的表。
AFTER INSERT, UPDATE, DELETE表示触发器在插入、更新或删除操作之后执行。
在触发器的主体部分,我们使用SET语句将CONTEXT_INFO()函数的返回值转换
为NVARCHAR(MAX)类型的变量@sql。
然后,我们使用PRINT语句打印该变量的值,即触发器执行的SQL 语句。
请注意,CONTEXT_INFO()函数返回的上下文信息中包含了触发器执行的完整SQL 语句。
因此,如果你的触发器执行了多个SQL 语句,它们都会包含在返回的上下文信息中。
如果你只想获取特定的SQL 语句,你可能需要对返回的上下文信息进行进一步处理或解析。
sqlserver触发器 instead of 用法
sqlserver触发器 instead of 用法SQL Server 触发器(Trigger)是一种特殊的存储过程,它会在指定的数据库操作(如插入、更新、删除)发生时自动执行。
而 "Instead of" 触发器是其中的一种类型,它允许用户自定义操作来替代默认的数据库操作。
"Instead of" 触发器通常用于对视图或表的 INSERT、UPDATE 或 DELETE 操作进行自定义处理。
当用户对这些视图或表进行插入、更新或删除操作时,"Instead of" 触发器会在默认操作之前执行用户定义的操作,而不是执行默认的数据库操作。
使用 "Instead of" 触发器的步骤如下:1. 创建触发器:使用 CREATE TRIGGER 语句创建触发器并指定它的类型为 "Instead of"。
例如:```sqlCREATE TRIGGER trigger_name ON table_nameINSTEAD OF {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器的自定义操作END```其中,trigger_name 是触发器的名称,table_name 是需要触发触发器的表或视图的名称,{INSERT | UPDATE | DELETE} 是要进行自定义操作的类型。
2. 编写触发器的自定义操作:在 BEGIN 和 END 之间编写触发器需要执行的自定义操作。
3. 运行触发器:创建触发器后,当操作触发该触发器的条件时,触发器将自动运行。
需要注意的是,"Instead of" 触发器只能在视图和表上使用,并且只能定义一个 "Instead of" 触发器来替代每个操作类型(INSERT、UPDATE、DELETE)。
下面是一个使用 "Instead of" 触发器的示例,该触发器用于在执行插入操作时执行自定义操作:```sqlCREATE TRIGGER instead_of_insert_trigger_name ONtable_nameINSTEAD OF INSERTASBEGIN-- 触发器的自定义操作INSERT INTO table_name (column1, column2)SELECT column1, column2 FROM inserted;END```在上述示例中,当插入操作触发该触发器时,触发器将执行自定义操作,将插入的数据插入到表中。
SqlServer触发器(插入删除操作)
SqlServer触发器(插⼊删除操作)插⼊触发器:例(触发器desk1)当表desk插⼊⼀条语句后,触发触发器desk1,之后向表booksheet中插⼊⼀条语句:create trigger desk1on deskafter insertasbegindeclare @Name_1 varchar(10),@Sex_1 nchar(2);declare @Phone_2 nchar(11);declare @Number_1 int,@Time_1 nvarchar(6),@Date_1 nvarchar(10);declare @Environment_1 nvarchar(6),@Phone_1 nchar(11),@id_1 int;select @Phone_2=Phone from inserted;select @Name_1= from userall where @Phone_2=userall.Phone;select @Sex_1=userall.Sex from userall where @Phone_2=userall.Phone;select @Number_1=Number, @Time_1=Time, @Date_1=Date, @Environment_1=Environment,@Phone_1=Phone,@id_1=id from inserted;insert into booksheet(Phone,Number,Time,Date,Environment,Name,Sex,id) values (@Phone_1,@Number_1,@Time_1,@Date_1,@Environment_1,@Name_1,@Sex_1,@id_1); end触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。
这两张是逻辑表也是虚表。
sqlserver触发器语法
sqlserver触发器语法SQL Server触发器是一种特殊类型的存储过程,它会在特定的数据库表上自动执行。
触发器可以在插入、更新或删除数据时触发,从而允许开发人员实现复杂的业务逻辑和数据完整性约束。
触发器的语法如下:sql.CREATE TRIGGER trigger_name.ON table_name.AFTER INSERT, UPDATE, DELETE.AS.BEGIN.-触发器逻辑。
END;其中,`trigger_name` 是触发器的名称,`table_name` 是触发器所绑定的表名。
`AFTER INSERT, UPDATE, DELETE` 指定了触发器在哪些操作之后执行。
`BEGIN` 和 `END` 之间是触发器的逻辑代码。
触发器可以根据需要在不同的操作后触发,例如,可以创建一个在插入数据后触发的触发器,以执行特定的业务逻辑。
触发器可以访问插入、更新或删除操作影响的数据,并根据需要对其进行修改。
在触发器的逻辑代码中,可以使用 INSERTED 和 DELETED 表来访问触发操作影响的数据。
INSERTED 表包含了插入或更新操作后的新数据,而 DELETED 表包含了更新或删除操作前的旧数据。
除了上述的基本语法,触发器还可以包括条件判断、事务处理和错误处理等逻辑。
需要注意的是,触发器的复杂性和执行频率应该被谨慎考虑,以避免对数据库性能产生负面影响。
总之,SQL Server触发器是一种强大的数据库对象,通过合理使用触发器,可以实现数据完整性约束、业务逻辑的复杂处理以及数据审计等功能。
在使用触发器时,需要充分理解其语法和行为,以确保数据库的稳定性和性能。
sqlserver触发器写法
sqlserver触发器写法
sql server触发器是一种特殊的数据库对象,它能及时地响应特定的数据库事件发生的情况,做出相应的反应,从而改变和保护数据库的状态。
它是一种强大有用的工具,可以帮助数据库开发者将整个数据库管理有序化,确保数据的一致性,正确性以及安全性。
实际上,sql server触发器一般都是附加在表和视图之上的,当某表数据发生改变时,就会触发触发器,进而执行触发器中定义好的相应动作。
比如,当某表中的某列数据发生更改时,就可以触发一个特殊的存储过程,实施对应的修改或删除处理操作,以确保数据的一致性等。
sql server触发器可以按照事件的类型来分类,如在Insert、Update或Delete数据操作后触发,以及在某个表内满足要求条件时触发。
此外,sql server触发器还允许用户根据实际运行时的数据情况,进行条件测试,决定是否要运行触发器。
总之,sql server触发器是一种很有用,而且可以非常有效地控制数据库安全性和一致性的重要工具,它能够有效避免数据库忘记或错误地进行更改的风险。
SQLSERVER各类触发器的完整语法及参数说明(拓展)
SQLSERVER各类触发器的完整语法及参数说明(拓展)语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER [ schema_name . ]trigger_nameON { table | view }[ WITH <dml_trigger_option> [ ,...n ] ]{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }<dml_trigger_option> ::=[ ENCRYPTION ][EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_nameTrigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)CREATE TRIGGER trigger_nameON { ALL SERVER | DATABASE }[ WITH <ddl_trigger_option> [ ,...n ] ]{ FOR | AFTER } { event_type | event_group } [ ,...n ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }<ddl_trigger_option> ::=[ ENCRYPTION ][ EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_nameTrigger on a LOGON event (Logon Trigger)CREATE TRIGGER trigger_nameON ALL SERVER[ WITH <logon_trigger_option> [ ,...n ] ]{ FOR| AFTER } LOGONAS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }<logon_trigger_option> ::=[ ENCRYPTION ][ EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_name参数:schema_nameDML 触发器所属架构的名称。
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。
SqlServer触发器常用语法AFTER、INSTEADOF及其详解
SqlServer触发器常⽤语法AFTER、INSTEADOF及其详解先创建⼀个简单的触发器CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]AST-SQL语句GO触发器位置:数据库>表>我这⾥是表名table_name>触发器解释:1、[WITH ENCRYPTION]:表⽰将该触发器加密,加密后触发器执⾏⽅法将⽆法被查看[DELETE, INSERT, UPDATE]对应为当执⾏删除、插⼊、更新三种动作时被触发执⾏insert时,获取插⼊后的数据,可⽤select*from inserted读取执⾏delete时,获取删除前的数据,可⽤select*from deleted读取执⾏update时,获取更新前的数据,可⽤select*from deleted读取,获取更新后数据,可⽤select*from inserted读取2、AFTER:操作成功后(这⾥是插⼊table_a后),执⾏触发器操作例如CREATE TRIGGER T_AON table_aafter insertasbegindeclare @id int,@name varchar(20)select @id=id,@name=name from insertedinsert into table_b values(@id,@name)end3、INSTEAD OF:该触发器只是数据库的“导⽕线”,触发器是否能执⾏到想要的结果,需要由触发器中的逻辑进⾏判断,因为该触发器往往伴随着很多的判断分⽀。
例如CREATE TRIGGER T_BON table_ainstead of insertasbeginIF EXISTS(select*from table_a where name =(select name from inserted))ROLLBACK TRANSACTIONPRINT '该姓名已存在'ELSEINSERT INTO table_a VALUES(select*from inserted)PRINT '插⼊成功'end************更多触发器的基本使⽤将随时更新在本页⾯************。
SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表
SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表该⽂章为原创,⽇后可能会根据实际开发经验和⽹友评论,进⾏相应地⽅修改,为获得最新博客动态,望在转发博客的时候注明出处。
触发器要实现的功能:(1)获取对表Table1数据操作操作类型(insert、delete或update)。
(2)将表修改后的数据保存到表Table2(该表结构与Table1表结构类似)。
例如:1>向表Table1添加数据1,表保存后,将数据1添加到表Table2,并将操作类型:insert,保存到表Table2的ChangeType列。
2>修改表Table1,将数据1改成数据2,表保存后,将数据2添加到表Table2,并将操作类型:update,保存到表Table2的ChangeType列。
3>删除表Table1数据1,表保存后,将数据2添加到表Table2,并将操作类型:delete,保存到表Table2的ChangeType列。
表结构:(1)表Table11CREATE TABLE Table1(2[ID][BIGINT]IDENTITY(1,1) NOT NULL,3[Name][NVARCHAR](20) NULL,4[Sex][NVARCHAR](2) NULL,5[Address][NVARCHAR](50) NULL,6[Age][INT]NULL,7[Birthday][DATE]NULL8 ) ON[PRIMARY](2)表Table21CREATE TABLE Table2(2[ID][BIGINT]IDENTITY(1,1) NOT NULL,3[Name][NVARCHAR](20) NULL,4[Sex][NVARCHAR](2) NULL,5[Address][NVARCHAR](50) NULL,6[Age][INT]NULL,7[Birthday][DATE]NULL,8[ChangeType][NVARCHAR](50) NOT NULL9 ) ON[PRIMARY]触发器Tri_Table11CREATE TRIGGER[Tri_Table1]ON[Table1]2--After触发器,对表进⾏insert、delete、update后触发3 AFTER INSERT, DELETE, UPDATE4AS5BEGIN6BEGIN TRY7BEGIN TRAN;8DECLARE@maxID NVARCHAR(50) ,9@inserted INT ,10@deleted INT ,11@ChangeType NVARCHAR(20);12SELECT@inserted=COUNT(1)13FROM Inserted;14SELECT@deleted=COUNT(1)15FROM Deleted;16--判断对表Table1的操作类型17IF@inserted>018AND@deleted=019BEGIN20SET@ChangeType='INSERT';21END;22ELSE23IF@inserted>024AND@deleted>025BEGIN26SET@ChangeType='UPDATE';27END;28ELSE29IF@inserted=030AND@deleted>031BEGIN32SET@ChangeType='DELETE';33END;34IF@ChangeType='DELETE'35BEGIN36SELECT@maxID= Id37FROM Deleted;38--如果对Table1同⼀条数据,进⾏多次操作,则Table2只保存最新数据39IF EXISTS ( SELECT COUNT(1)40FROM Table241WHERE Id =@maxID )42BEGIN43DELETE FROM Table244WHERE Id =@maxID;45END;46INSERT INTO Table247 (48 )49SELECT ID,50 Name,51 Sex,52 Address,53 Age,54 Birthday,55@ChangeType AS ChangeType56FROM Deleted;57END;58ELSE59BEGIN60SELECT@maxID= Id61FROM Inserted;62IF EXISTS ( SELECT COUNT(1)63FROM Table264WHERE Id =@maxID )65BEGIN66DELETE FROM Table267WHERE Id =@maxID;68END;69INSERT INTO Table270 (71 ID,72 Name,73 Sex,74 Address,75 Age,76 Birthday,77 ChangeType78 )79SELECT ID,80 Name,81 Sex,82 Address,83 Age,84 Birthday,85@ChangeType AS ChangeType86FROM Inserted87END;88COMMIT TRAN;89END TRY90BEGIN CATCH91IF XACT_STATE() =-192ROLLBACK TRAN;93END CATCH;94END;95。
SQLServer用触发器实现表的历史记录
SQLServer⽤触发器实现表的历史记录在许多应⽤中,需要保存某个数据表的历史记录,以供以后查询,在 SQL Server 2000中,可以利⽤触发器轻松实现历史记录功能。
在触发器中,需要⽤到 SQL Server 的 inserted 和 deleted 两个虚拟表,在执⾏ sql命令时,这两个虚拟表分别记录的内容如下:sql命令 deleted inserted---------------------------------------------------insert [不可⽤] 新插⼊的记录update 被更新前的记录被更新后的记录delete 被删除的记录 [不可⽤]---------------------------------------------------下⾯通过⼀个例⼦来演⽰具体的实现⽅法。
例如:当前有⼀个数据表 table1, 有 field1, field2, field3 三个字段。
现在我们需要在 table1 发⽣变化(插⼊,修改,删除)时,记录下每次改动的情况。
这只需要通过如下两个步骤就可以实现:1)创建⼀个新表 table1_log, ⽤于记录 table1 的历史数据。
table1_log 有如下字段:field1, field2, field3, sqlcomm (varchar 10), exectime (datetime)这⽐ table1 多了 sqlcomm, exectime 两个字段,分别记录 sql 语句的 insert,update, delete 命令和命令执⾏的时间)2)在表 table1 上增加触发器,以在 table1 发⽣变动时,⾃动写⼊ table1_log.-- 针对 insert 命令,增加名为 trTable1_I 的触发器:-------------------------------- trTable1_I ----------------------------IF EXISTS (SELECT * FROM dbo.sysobjectsWHERE id = object_id(N'[trTable1_I]')AND OBJECTPROPERTY(id, N'IsTrigger') = 1)DROP TRIGGER [trTable1_I]GOCREATE TRIGGER trTable1_ION table1AFTER insertASif @@rowcount = 0 --如果影响的⾏数为 0,则结束触发器运⾏,避免占⽤资源returninsert into table1_log (field1, field2, field3, sqlcomm, exectime)select field1, field2, field3, 'insert', {fn NOW()} from insertedgo-------------------------------- end trTable1_I ------------------------- 针对 update 命令,增加名为 trTable1_U 的触发器:-------------------------------- trTable1_U ----------------------------IF EXISTS (SELECT * FROM dbo.sysobjectsWHERE id = object_id(N'[trTable1_U]')AND OBJECTPROPERTY(id, N'IsTrigger') = 1)DROP TRIGGER [trTable1_U]GOCREATE TRIGGER trTable1_UON table1AFTER updateASif @@rowcount = 0 --如果影响的⾏数为 0,则结束触发器运⾏,避免占⽤资源returninsert into table1_log (field1, field2, field3, sqlcomm, exectime)select field1, field2, field3, 'update', {fn NOW()} from insertedgo-------------------------------- end trTable1_U ------------------------- 针对 delete 命令,增加名为 trTable1_D 的触发器:-------------------------------- trTable1_D ----------------------------IF EXISTS (SELECT * FROM dbo.sysobjectsWHERE id = object_id(N'[trTable1_D]')AND OBJECTPROPERTY(id, N'IsTrigger') = 1)DROP TRIGGER [trTable1_D]GOCREATE TRIGGER trTable1_DON table1AFTER deleteASif @@rowcount = 0 --如果影响的⾏数为 0,则结束触发器运⾏,避免占⽤资源returninsert into table1_log (field1, field2, field3, sqlcomm, exectime)select field1, field2, field3, 'delete', {fn NOW()} from deletedgo-------------------------------- end trTable1_D -----------------------在查询分析器中运⾏以上代码,以后 table1 发⽣的变化都会记录在 table1_log 表中了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触发器建立的代码
Create Trigger TG_ProjectName
On table1
After Update
As
Update table2
Set[工程名]=b.工程名
from table2 a,inserted b
where a.ProjID=b.ID
关于触发器中Inserted和Deleted的解释。
inserted触发器语句中使用了两种特殊的表:deleted 表和inserted 表。
Microsoft® SQL Server 2000 自动创建和管理这些表。
可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。
inserted 和deleted 表主要用于触发器中:
◆扩展表间引用完整性。
◆在以视图为基础的基表中插入或更新数据。
◆检查错误并基于错误采取行动。
◆找到数据修改前后表状态的差异,并基于此差异采取行动。
Deleted 表用于存储DELETE 和UPDATE 语句所影响的行的复本。
在执行DELETE 或UPDATE 语句时,行从触发器表中删除,并传输到deleted 表中。
Deleted 表和触发器表通常没有相同的行。
Inserted 表用于存储INSERT 和UPDATE 语句所影响的行的副本。
在一个插入或更新事务处理中,新建行被同时添加到inserted 表和触发器表中。
Inserted 表中的行是触发器表中新行的副本。
更新事务类似于在删除之后执行插入;首先旧行被复制到deleted 表中,然后新行被复制到触发器表和inserted 表中。
在设置触发器条件时,应当为引发触发器的操作恰当使用inserted 和deleted 表。
虽然在测试INSERT 时引用deleted 表或在测试DELETE 时引用inserted 表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。
说明
如果触发器操作取决于一个数据修改所影响的行数,应该为多行数据修改(基于SELECT 语句的INSERT、DELETE 或UPDATE)使用测试(如检查@@ROWCOUNT),然后采取相应的对策。
SQL Server 2000不允许AFTER 触发器引用inserted 和deleted 表中的text、ntext 或image 列;然而,允许INSTEAD OF 触发器引用这些列。
有关更多信息,请参见CREATE TRIGGER。
在INSTEAD OF 触发器中使用inserted 和deleted 表
传递到在表上定义的INSTEAD OF 触发器的inserted 和deleted 表遵从与传递到AFTER 触发器的inserted 和deleted 表相同的规则。
inserted 和deleted 表的格式与在其上定义INSTEAD OF 触发器的表的格式相同。
inserted 和deleted 表中的每一列都直接映射到基表中的列。
有关引用带INSTEAD OF 触发器的表的INSERT 或UPDATE 语句何时必须提供列值的规则与表没有INSTEAD OF 触发器时相同:
不能为计算列或具有timestamp 数据类型的列指定值。
不能为具有IDENTITY 属性的列指定值,除非该列的IDENTITY_INSERT 为ON。
当IDENTITY_INSERT 为ON 时,INSERT 语句必须提供一个值。
INSERT 语句必须为所有无DEFAULT 约束的NOT NULL 列提供值。
对于除计算列、标识列或timestamp 列以外的任何列,任何允许空值的列或具有DEFAULT 定义的NOT NULL 列的值都是可选的。
当INSERT、UPDATE 或DELETE 语句引用具有INSTEAD OF 触发器的视图时,数据库引擎将调用该触发器,而不是对任何表采取任何直接操作。
即使为视图生成的inserted 和deleted 表中的信息格式与基表中的数据格式不同,该触发器在生成执行基表中的请求操作所需的任何语句时,仍必须使用inserted 和deleted 表中的信息。
传递到在视图上定义的INSTEAD OF 触发器的inserted 和deleted 表格式与为该视图定义的SELECT 语句的选择列表相匹配。
例如:
CREATEVIEWEmployeeNames(EmployeeID,LName,FName)
AS
SELECTEmployeeID,LastName,FirstName
FROMNorthwind.dbo.Employees
视图的结果集有三列:一个int 列和两个nvarchar 列。
传递到在视图上定义的INSTEAD OF 触发器的inserted 和deleted 表也具有名为EmployeeID 的int 列、名为LName 的nvarchar 列和名为FName 的nvarchar 列。
视图的选择列表还包含不直接映射到单个基表列的表达式。
一些视图表达式(如常量调用或函数调用)可能不引用任何列,这类表达式会被忽略。
复杂的表达式会引用多列,但在inserted 和deleted 表中,每个插入的行仅有一个值。
如果视图中的简单表达式引用具有复杂表达式的计算列,则这些简单表达式也有同样的问题。
视图上的INSTEAD OF 触发器必须处理这些类型的表达式。
有关更多信息,请参见视图上INSTEAD OF 触发器中的表达式和计算列。
顺便说一下,当对某张表建立触发器后,分3种情况讨论
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)。