当前位置:文档之家› SQL触发器语法参考

SQL触发器语法参考

SQL触发器语法参考
SQL触发器语法参考

SQL触发器语法参考

CreateTRIGGER trigger_name

ON { table | view }

[ WITH ENCRYPTION ]

{

{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS

[ { IF Update ( column )

[ { AND | or } Update ( column ) ]

[ ...n ]

| IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask)

{ comparison_operator } column_bitmask [ ...n ]

} ]

sql_statement [ ...n ]

}

}

参数

trigger_name

是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。

Table | view

是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION

加密syscomments 表中包含Create TRIGGER语句文本的条目。使用WITH ENCRYP TION 可防止将触发器作为SQL Server复制的一部分发布。

AFTER

指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定FOR 关键字,则AFTER是默认设置。

不能在视图上定义AFTER 触发器。

INSTEAD OF

指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。

在表或视图上,每个Insert、Update 或Delete语句最多可以定义一个INSTEAD OF 触发器。然而,可以在每个具有INSTEAD OF 触发器的视图上定义视图。

INSTEAD OF 触发器不能在WITH CHECK OPTION的可更新视图上定义。如果向指定了WITH CHECK OPTION选项的可更新视图添加INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用Alter VIEW 删除该选项后才能定义INSTEADOF 触发器。

{ [Delete] [,] [Insert] [,][Update] }

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

对于INSTEAD OF 触发器,不允许在具有ON Delete级联操作引用关系的表上使用De lete 选项。同样,也不允许在具有ONUpdate 级联操作引用关系的表上使用Update 选项。

WITH APPEND

指定应该添加现有类型的其它触发器。只有当兼容级别是65或更低时,才需要使用该可选子句。如果兼容级别是70或更高,则不必使用WITH APPEND子句添加现有类型的其它触发器(这是兼容级别设置为70 或更高的CreateTRIGGER 的默认行为)。有关更多信息,请参见sp_dbcmptlevel。

WITH APPEND 不能与INSTEAD OF触发器一起使用,或者,如果显式声明AFTER触发器,也不能使用该子句。只有当出于向后兼容而指定FOR 时(没有INSTEAD OF 或AFTER),才能使用WITH APPEND。以后的版本将不支持WITH APPEND 和FOR(将被解释为AFTER)。

NOT FOR REPLICATION

表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

AS

是触发器要执行的操作。

sql_statement

是触发器的条件和操作。触发器条件指定其它准则,以确定Delete、Insert 或Update 语句是否导致执行触发器操作。

当尝试Delete、Insert 或Update操作时,Transact-SQL语句中指定的触发器操作将生效。

触发器可以包含任意数量和种类的Transact-SQL语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的Transact-SQL 语句常常包含控制流语言。Create TRIGGER语句中使用几个特殊的表:

deleted 和inserted是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted 表中的所有值,请使用:

Select *

FROM deleted

如果兼容级别等于70,那么在Delete、Insert 或Update 触发器中,SQL Server 将不允许引用inserted 和deleted 表中的text、ntext 或image 列。不能访问inserted 和del eted 表中的text、ntext 和image 值。若要在Insert 或Update触发器中检索新值,请将inserted 表与原始更新表联接。当兼容级别是65或更低时,对inserted 或deleted 表中允许空值的text、ntext 或image列,将返回空值;如果这些列不可为空,则返回零长度字符串。

当兼容级别是80 或更高时,SQL Server 允许在表或视图上通过INSTEADOF 触发器更新text、ntext 或image 列。

n

是表示触发器中可以包含多条Transact-SQL语句的占位符。对于IF Update (column)

语句,可以通过重复Update(column) 子句包含多列。

IF Update (column)

测试在指定的列上进行的Insert 或Update操作,不能用于Delete 操作。可以指定多列。因为在ON子句中指定了表名,所以在IF Update子句中的列名前不要包含表名。若要测试在多个列上进行的Insert 或Update 操作,请在第一个操作后指定单独的Update(colu mn) 子句。在Insert 操作中IF Update 将返回TRUE值,因为这些列插入了显式值或隐性(NULL) 值。

说明IF Update (column) 子句的功能等同于IF、IF...ELSE 或WHILE 语句,并且可以使用BEGIN...END语句块。有关更多信息,请参见控制流语言。

可以在触发器主体中的任意位置使用Update (column)。

是要测试Insert 或Update 操作的列名。该列可以是SQL Server支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。

IF (COLUMNS_UpdateD())

测试是否插入或更新了提及的列,仅用于Insert 或Update触发器中。COLUMNS_Updat eD 返回varbinary位模式,表示插入或更新了表中的哪些列。

COLUMNS_UpdateD函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含8 列以上,则COLUMNS_UpdateD返回多个字节,最左边的为最不重要的字节。在Inse rt 操作中COLUMNS_UpdateD 将对所有列返回TRUE值,因为这些列插入了显式值或隐性(NULL) 值。

可以在触发器主体中的任意位置使用COLUMNS_UpdateD。

bitwise_operator

是用于比较运算的位运算符。

updated_bitmask

是整型位掩码,表示实际更新或插入的列。例如,表t1 包含列C1、C2、C3、C4 和C5。假定表t1 上有Update 触发器,若要检查列C2、C3 和C4 是否都有更新,指定值14;若要检查是否只有列C2有更新,指定值2。

comparison_operator

是比较运算符。使用等号(=) 检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号(>) 检查updated_bitmask 中指定的任一列或某些列是否已更新。

column_bitmask

是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

注释

触发器常常用于强制业务规则和数据完整性。SQL Server通过表创建语句(Alter TABLE 和Create TABLE)提供声明引用完整性(DRI);但是DRI不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(A lterTABLE 和Create TABLE 的PRIMARY KEY 和FOREIGN KEY关键字)。如果触发器表存在约束,则在INSTEAD OF 触发器执行之后和AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚INSTEAD OF触发器操作且不执行(激发)AFTER 触

可用sp_settriggerorder 指定表上第一个和最后一个执行的AFTER触发器。在表上只能为每个Insert、Update 和Delete操作指定一个第一个执行和一个最后一个执行的AFTE R触发器。如果同一表上还有其它AFTER触发器,则这些触发器将以随机顺序执行。

如果Alter TRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用sp_settriggerorder 重置排序值。

只有当触发SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER触发器才会执行。AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的Update 和Delete 引用级联操作的效果。

触发器限制

Create TRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。

触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。

如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。

在同一条Create TRIGGER 语句中,可以为多种用户操作(如Insert 和Update)定义相同的触发器操作。

如果一个表的外键在Delete/Update操作上定义了级联,则不能在该表上定义INSTEAD OF Delete/Update触发器。

在触发器内可以指定任意的SET 语句。所选择的SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。

与使用存储过程一样,当触发器激发时,将向调用应用程序返回结果。若要避免由于触发器激发而向应用程序返回结果,请不要包含返回结果的Select语句,也不要包含在触发器中进行变量赋值的语句。包含向用户返回结果的Select语句或进行变量赋值的语句的触发器需要特殊处理;这些返回的结果必须写入允许修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SET NOCOUNT 语句以避免返回任何结果集。

Delete 触发器不能捕获TRUNCATE TABLE 语句。尽管TRUNCATE TABLE语句实际上是没有Where 子句的Delete(它删除所有行),但它是无日志记录的,因而不能执行触发器。因为TRUNCATE TABLE语句的权限默认授予表所有者且不可转让,所以只有表所有者才需要考虑无意中用TRUNCATE TABLE 语句规避Delete 触发器的问题。

无论有日志记录还是无日志记录,WRITETEXT 语句都不激活触发器。

触发器中不允许以下Transact-SQL 语句:

Alter DATABASE Create DATABASE DISK INIT

DISK RESIZE Drop DATABASE LOAD DATABASE

LOAD LOG RECONFIGURE RESTORE DATABASE

RESTORELOG

说明由于SQL Server不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。

多个触发器

SQL Server 允许为每个数据修改事件(Delete、Insert 或Update)创建多个触发器。例如,如果对已有Update 触发器的表执行Create TRIGGER FORUpdate,则将创建另一个更新触发器。在早期版本中,在每个表上,每个数据修改事件(Insert、Update或Delet e)只允许有一个触发器。

说明如果触发器名称不同,则CreateTRIGGER(兼容级别为70)的默认行为是在现有的触发器中添加其它触发器。如果触发器名称相同,则SQL Server 返回一条错误信息。但是,如果兼容级别等于或小于65,则使用Create TRIGGER语句创建的新触发器将替换同一类型的任何现有触发器,即使触发器名称不同。有关更多信息,请参见sp_dbcmptl evel。

递归触发器

当在sp_dboption 中启用recursivetriggers 设置时,SQL Server 还允许触发器的递归调用。

递归触发器允许发生两种类型的递归:

间接递归

直接递归

使用间接递归时,应用程序更新表T1,从而激发触发器TR1,该触发器更新表T2。在这种情况下,触发器T2 将激发并更新T1。

使用直接递归时,应用程序更新表T1,从而激发触发器TR1,该触发器更新表T1。由于表T1 被更新,触发器TR1再次激发,依此类推。

下例既使用了间接触发器递归,又使用了直接触发器递归。假定在表T1中定义了两个更新触发器TR1 和TR2。触发器TR1 递归地更新表T1。Update 语句使TR1 和TR2 各

执行一次。而TR1 的执行将触发TR1(递归)和TR2 的执行。给定触发器的inserted 和deleted表只包含与唤醒调用触发器的Update 语句相对应的行。

说明只有启用sp_dboption 的recursive triggers设置,才会发生上述行为。对于为给定事件定义的多个触发器,并没有确定的执行顺序。每个触发器都应是自包含的。

禁用recursive triggers设置只能禁止直接递归。若要也禁用间接递归,请使用sp_config ure 将nested triggers 服务器选项设置为0。

如果任一触发器执行了ROLLBACK TRANSACTION语句,则无论嵌套级是多少,都不会进一步执行其它触发器。

嵌套触发器

触发器最多可以嵌套32层。如果一个触发器更改了包含另一个触发器的表,则第二个触发器将激活,然后该触发器可以再调用第三个触发器,依此类推。如果链中任意一个触发器引发了无限循环,则会超出嵌套级限制,从而导致取消触发器。若要禁用嵌套触发器,请用s p_configure 将nested triggers 选项设置为0(关闭)。默认配置允许嵌套触发器。如果嵌套触发器是关闭的,则也将禁用递归触发器,与sp_dboption 的recursive triggers 设置无关。

延迟名称解析

SQL Server 允许Transact-SQL存储过程、触发器和批处理引用编译时不存在的表。这种能力称为延迟名称解析。但是,如果Transact-SQL存储过程、触发器或批处理引用在存储过程或触发器中定义的表,则只有当兼容级别设置(通过执行sp_dbcmptlevel 设置)等于65时,才会在创建时发出警告。如果使用批处理,则在编译时发出警告。如果引用的表不存在,将在运行时返回错误信息。有关更多信息,请参见延迟名称解析和编译。

权限

Create TRIGGER 权限默认授予定义触发器的表所有者、sysadmin固定服务器角色成员以及db_owner 和db_ddladmin固定数据库角色成员,并且不可转让。

若要检索表或视图中的数据,用户必须在表或视图中拥有Select语句权限。若要更新表或视图的内容,用户必须在表或视图中拥有Insert、Delete 和Update 语句权限。

如果视图中存在INSTEAD OF 触发器,用户必须在该视图中有Insert、Delete 和Updat e 特权,以对该视图发出Insert、Delete 和Update 语句,而不管实际上是否在视图上执行了这样的操作。

示例

A. 使用带有提醒消息的触发器

当有人试图在titles表中添加或更改数据时,下例将向客户端显示一条消息。

说明消息50009 是sysmessages中的用户定义消息。有关创建用户定义消息的更多信息,请参见sp_addmessage。

USE pubs

IF EXISTS (Select name FROM sysobjects

Where name = 'reminder' AND type = 'TR')

Drop TRIGGER reminder

GO

Create TRIGGER reminder

ON titles

FOR Insert, Update

AS RAISERROR (50009, 16, 10)

GO

B. 使用带有提醒电子邮件的触发器

当titles 表更改时,下例将电子邮件发送给指定的人员(MaryM)。

USE pubs

IF EXISTS (Select name FROM sysobjects

Where name = 'reminder' AND type = 'TR')

Drop TRIGGER reminder

GO

Create TRIGGER reminder

ON titles

FOR Insert, Update, Delete

AS

EXEC master..xp_sendmail'MaryM',

'Don''t forget to print a report for the distributors.'

GO

C. 在employee 和jobs 表之间使用触发器业务规则

由于CHECK约束只能引用定义了列级或表级约束的列,表间的任何约束(在下例中是指业务规则)都必须定义为触发器。

下例创建一个触发器,当插入或更新雇员工作级别(job_lvls)时,该触发器检查指定雇员的工作级别(由此决定薪水)是否处于为该工作定义的范围内。若要获得适当的范围,必须引用jobs 表。

USE pubs

IF EXISTS (Select name FROM sysobjects

Where name = 'employee_insupd' AND type = 'TR')

Drop TRIGGERemployee_insupd

GO

Create TRIGGER employee_insupd

ON employee

FOR Insert, Update

AS

/* Get the range of level for this job type from the jobs table.*/ DECLARE @min_lvl tinyint,

@max_lvl tinyint,

@emp_lvl tinyint,

@job_id smallint

Select @min_lvl = min_lvl,

@max_lvl = max_lvl,

@emp_lvl = i.job_lvl,

@job_id = i.job_id

FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id JOIN jobs j ON j.job_id =i.job_id

IF (@job_id = 1) and (@emp_lvl 10)

BEGIN

RAISERROR ('Job id 1 expectsthe default level of 10.', 16, 1) ROLLBACK TRANSACTION

END

ELSE

IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)

BEGIN

RAISERROR ('The level forjob_id:%d should be between %d and %d.', 16, 1, @job_id, @min_lvl, @max_lvl)

ROLLBACK TRANSACTION

END

D. 使用延迟名称解析

下例创建两个触发器以说明延迟名称解析。

USE pubs

IF EXISTS (Select name FROM sysobjects

Where name = 'trig1' AND type = 'TR')

Drop TRIGGER trig1

GO

-- Creating a trigger on a nonexistent table.

Create TRIGGER trig1

on authors

FOR Insert, Update, Delete

AS

Select a.au_lname, a.au_fname,https://www.doczj.com/doc/3b3008696.html,

FROM authors a INNER JOINdoes_not_exist x

ON a.au_id = x.au_id

GO

-- Here is the statement to actually see the text of thetrigger.

Select o.id, c.text

FROM sysobjects o INNER JOIN syscomments c

ON o.id = c.id

Where o.type = 'TR' and https://www.doczj.com/doc/3b3008696.html, = 'trig1'

-- Creating a trigger on an existing table, but with anonexistent

-- column.

USE pubs

IF EXISTS (Select name FROM sysobjects

Where name = 'trig2' AND type = 'TR')

Drop TRIGGER trig2

GO

Create TRIGGER trig2

ON authors

FOR Insert, Update

AS

DECLARE @fax varchar(12)

Select @fax =phone

FROM authors

GO

-- Here is the statement to actually see the text of thetrigger.

Select o.id, c.text

FROM sysobjects o INNER JOIN syscomments c

ON o.id = c.id

Where o.type = 'TR' and https://www.doczj.com/doc/3b3008696.html, = 'trig2'

E. 使用COLUMNS_UpdateD

下例创建两个表:一个employeeData 表和一个auditEmployeeData表。人力资源部的成员可以修改employeeData表,该表包含敏感的雇员薪水信息。如果更改了雇员的社会保险号码(SSN)、年薪或银行帐户,则生成审核记录并插入到auditEmployeeData审核表。

通过使用COLUMNS_UpdateD()功能,可以快速测试对这些包含敏感雇员信息的列所做的更改。只有在试图检测对表中的前8 列所做的更改时,COLUMNS_UpdateD() 才起作用。

USE pubs

IF EXISTS(Select TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Where TABLE_NAME ='employeeData')

Drop TABLE employeeData

IF EXISTS(Select TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Where TABLE_NAME ='auditEmployeeData')

Drop TABLEauditEmployeeData

GO

Create TABLE employeeData (

emp_id int NOT NULL,

emp_bankAccountNumber char(10) NOT NULL,

emp_salary int NOT NULL,

emp_SSN char (11) NOTNULL,

emp_lname nchar (32) NOTNULL,

emp_fname nchar (32) NOTNULL,

emp_manager int NOT NULL

)

GO

Create TABLE auditEmployeeData (

audit_log_id uniqueidentifierDEFAULT NEWID(),

audit_log_type char (3) NOTNULL,

audit_emp_id int NOTNULL,

audit_emp_bankAccountNumberchar (10) NULL,

audit_emp_salary intNULL,

audit_emp_SSN char (11)NULL,

audit_user sysname DEFAULTSUSER_SNAME(),

audit_changed datetime DEFAULTGETDATE()

)

GO

Create TRIGGER updEmployeeData

ON employeeData

FOR update AS

/*Check whether columns 2, 3 or 4 has been updated. If any or allof columns 2, 3 or 4 have been changed, create an audit record. Thebitmask is: power(2,(2-1))+po wer(2,(3-1))+power(2,(4-1)) = 14. Tocheck if all columns 2, 3, and 4 are updated, u se = 14 in place of>0 (below).*/

IF (COLUMNS_UpdateD() &14) > 0

/*Use IF (COLUMNS_UpdateD() & 14) = 14 to see if all of columns2, 3, and 4 are updated.*/

BEGIN

-- Audit OLD record.

Insert INTO auditEmployeeData

(audit_log_type,

audit_emp_id,

audit_emp_bankAccountNumber,

audit_emp_salary,

audit_emp_SSN)

Select 'OLD',

del.emp_id,

del.emp_bankAccountNumber,

del.emp_salary,

del.emp_SSN

FROM deleted del

-- Audit NEW record.

Insert INTO auditEmployeeData

(audit_log_type,

audit_emp_id,

audit_emp_bankAccountNumber,

audit_emp_salary,

audit_emp_SSN)

Select 'NEW',

ins.emp_id,

ins.emp_bankAccountNumber,

ins.emp_salary,

ins.emp_SSN

FROM inserted ins

END

GO

/*Inserting a new employee does not cause the Update trigger tofire.*/

Insert INTO employeeData

VALUES ( 101, 'USA-987-01',23000, 'R-M53550M', N'Mendel', N'Roland', 32)

GO

/*Updating the employee record for employee number 101 to changethe salary to 5 1000 causes the Update trigger to fire and an audittrail to be produced.*/

Update employeeData

SET emp_salary = 51000

Where emp_id = 101

GO

Select * FROM auditEmployeeData

GO

/*Updating the employee record for employee number 101 to changeboth the bank account number and social security number (SSN)causes the Update trigger to fire and an audit trail to beproduced.*/

Update employeeData

SET emp_bankAccountNumber ='133146A0', emp_SSN = 'R-M53550M'

Where emp_id = 101

GO

Select * FROM auditEmployeeData

GO

F. 使用COLUMNS_UpdateD 测试8 列以上

如果必须测试影响到表中前8 列以外的列的更新时,必须使用UBSTRING函数测试由C OLUMNS_UpdateD 返回的适当的位。下例测试影响Northwind.dbo.Customers 表中的第3、第5 或第9 列的更新。

USE Northwind

Drop TRIGGER tr1

GO

Create TRIGGER tr1 ON Customers

FOR Update AS

IF ((SUBSTRING(COLUMNS_UpdateD(),1,1)=power(2,(3-1))

+ power(2,(5-1)))

AND (SUBSTRING(COLUMNS_UpdateD(),2,1)=power(2,(1-1)))

)

PRINT 'Columns 3, 5 and 9updated'

GO

Update Customers

SETContactName=ContactName,

Address=Address,

Country=Country

GO

1。使用instead of触发器

create trigger t

on a

instead of insert,update,delete

as

print '不能修改'

SQL Server2008触发器学习笔记

触发器 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和After触发器 SQL Server提供了两种触发器﹕Instead of 和After 触发器。 这两种触发器的差别在于他们被激活的操作﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After 触发器被激活之前发生。After触发器只能用于表。一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。通常不能在一个基于连接的视图上进行DELETE操作,可以编写一个INSTEAD OF DELETE触发器来实现删除。可以访问那些如果视图是一个真正的表时已经被删除的数据行,它将把删除的行存储在deleted临时表中。 本次练习将通过具体的例子介绍如何使用INSTEAD OF触发器,使读者掌握INSTEAD OF 触发器的使用方法。 向student表中插入数据时,检查学号是否存在于student表中,如存在则进行插入操作,否则就不插入,具体语句如下所示: CREATE TRIGGER [checkid] ON dbo.student INSTEAD OF insert AS IF NOT EXISTS(SELECT * FROM dbo.student WHERE ID=(SELECT ID FROM INSERTED)) BEGIN ROLLBACK TRANSACTION PRINT '要处理记录的学号不存在!' END ELSE BEGIN INSERT NTO dbo.student select * from inserted

SQL触发器使用教程和命名规范

SQL触发器使用教程和命名规范 1,触发器简介 触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。而放弃使用触发器,则会导致系统架构设计上的问题,影响系统的稳定性。 2,触发器示例 触发器代码类似存储过程,以PL/SQL脚本编写。下面是一个触发器的示例: 新建员工工资表salary create table SALARY ( EMPLOYEE_ID NUMBER, --员工ID MONTH VARCHAR2(6), --工资月份 AMOUNT NUMBER --工资金额 ) 创建与salary关联的触发器salary_trg_rai 1 Create or replace trigger salary_trg_rai 2 After insert on salary 3 For each row

SQL server数据库设计实例

数据库原理与应用 课程设计A报告 姓名:袁一帆学号:20121480 学院(系):管理学院专业:信息管理与信息系统

班级:12级信管1 班

襄阳迈博信息科技有限公司企业考勤管理系统 一、系统目标设计 1系统开发的总体任务是实现企业员工考勤管理的系统化、规范化、和自动化。 2能够和人事管理系统、工资管理系统相结合,真正实现企业高效、科学、现代化的员工管理。 二、开发实际思想 1尽量采用公司现有软硬件环境,及先进的管理系统开发方案,从而达到充分利用公司现有资源,提高系统开发水平和应用效果的目的。 2员工考勤管理系统能够和考勤机相连接,从而完成自动、高效、科学的考勤信息输入。 3系统采用模块化程序设计方法,既便与系统功能的各种组合和修该,又便于未参与开发的技术维护人员补充、维护。 系统应具备数据库维护功能,即使根据用户需求进行数据的添加、删除、修改、被分等操作。 系统需求分析 1 考勤管理涉及企业人事管理的多个方面,如员工职务升迁、工资发放、奖金发放、员工医疗保险发放等等。本利自重的考勤管理系统需要完成功能主要有以下几点。 2 员工考勤信息处理。该莫完成员工考勤情况的输入、修改等操作。如果企业内有考勤机,可以将它的输出处理后,形成考勤管理系统考勤模块的

输入。 3 企业缺勤类型的设定。 4 企业考勤统计。该模块可对某个员工进行考勤情况的统计,生成统计报表。 5 缺勤时间,缺勤类型对工资的影响 6 缺勤时间,缺勤类型对升职的影响 数据字典 数据项 表1 名称员工编号 说明每个员工拥有唯一的编号 类型字符型 长度 4 有关数据存储员工基本信息存储 表2 名称员工姓名

SQL触发器基本教程

一、创建一个简单的触发器 触发器是一种特殊的存储过程,类似于事件函数,SQL Server? 允许为INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列T-SQL语句。触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。 创建触发器用CREATE TRIGGER CREATE TRIGGER 触发器名称 ON 表名 FOR I NSERT、UPDATE 或DELETE AS T-SQL 语句 注意:触发器名称是不加引号的。 如下是联机丛书上的一个示例,当在titles 表上更改记录时,发送邮件通知MaryM。CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE, DELETE AS EXEC master..xp_sendmail 'MaryM', 'Don''t forget to print a report for the distributors.' 二、删除触发器 用查询分析器删除 在查询分析器中使用drop trigger 触发器名称来删除触发器。 也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称... 注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在: if Exists(select name from sysobjects where name=触发器名称and xtype='TR') 用企业管理器删除 在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。 三、重命名触发器 用查询分析器重命名 exec sp_rename 原名称, 新名称 sp_rename 是SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

SQL触发器实例

--建立触发器,显示修改人数 create trigger d1 on jun for insert,update as select '你正在修改数据' declare @a varchar(20) select @a=str(@@rowcount)+'个学生被修改' select @a select * from jun return insert into jun(爱好) values('跑步') update jun set 爱好='打球' where 学号<='103' --建立触发器,当男生人数在6个以内可以加入,否则不能加入 create trigger i1 on zg for insert as if((select count(性别) from zg where 性别='男')>6) select '不能插入,男生人数已满。' else select'插入成功' select * from zg insert into zg(学号,姓名,性别) values(20100636,'江渝','男') --建立触发器,如果语文成绩在200以内可以修改,否则不能修改 create trigger u1 on zg for update as if((select max(语文) from zg )>200) begin select '你不能修改' rollback end else select '修改成功' select * from zg update zg set 语文=语文+10 where 姓名='唐荣强' update zg set 语文=语文-20 where 姓名='张军' update zg set 语文=语文+30 where 姓名='张军'

SQL触发器实例讲解

SQL触发器实例讲解 2008-11-27 16:16:45| 分类:PROCEDURE | 标签:|字号大中小订阅 SQL触发器实例1 定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) 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

删除 SQL Server 的实例

删除SQL Server 的特定实例 若要删除SQL Server 的特定实例,请按照下列步骤操作: 1.找到并删除%drive%:\Program Files\Microsoft SQL Server\MSSQL\Binn 文件 夹,其中%drive%是要删除的SQL Server 实例的位置。 2.找到以下注册表项: o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer 注意:如果要删除默认实例,则必须删除除Client项以外的所有项。 o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server 必须使用Regedt32.exe 来编辑要删除的实例的InstalledInstances 值。默认实例的显示名称为MSSQLSERVER,而命名实例的显示名称则为给该 实例指定的名称。 注意:不能使用Regedit.exe 编辑该值;您必须使用Regedt32.exe。 注意:如果这是SQL Server 2000 的群集实例,请为群集中的每个节点重复执行这些步骤。 删除SQL Server 的所有已知实例 若要删除SQL Server 的所有已知实例,请按照下列步骤操作: 1.找到并删除%drive%:\Program Files\Microsoft SQL Server\MSSQL\Binn 文件 夹。 2.找到并删除以下注册表项: o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server 3.找到并删除以下注册表项: o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQL Server o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSER VERAGENT o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQL ServerADHelper 4.步骤3 中的三个注册表项对应于Microsoft SQL Server 2000 的默认实例。命名实例 对应的注册表项与步骤 3 中列出的注册表项类似,但后面带有$instance_name,因

SQL触发器全过程(含实例讲解)

SQL触发器全过程 第一、概述 一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted 表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三:instead of 和 After触发器 SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同: Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行,进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。

一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。 四:触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束,那幺After触发器不会执行,因为对约束的检查是在After触发器被激动之前发生的。所以After 触发器不能超越约束。 Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。 五:使用T-SQL语句来创建触发器 基本语句如下: create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例合理的选用触发器会让你的系统更高效 2010 Ssc

目录 第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约束更复杂的限制。 1.4说明: 1.与CHECK约束不同,在触发器中可以引用其它的表。 2.触发器可以发现改变前后表中数据的不一致,并根据这些不同来进行相应的操作。

SQL触发器语法参考

SQL触发器语法参考 CreateTRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF Update ( column ) [ { AND | or } Update ( column ) ] [ ...n ] | IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } } 参数 trigger_name 是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。 Table | view 是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。 WITH ENCRYPTION 加密syscomments 表中包含Create TRIGGER语句文本的条目。使用WITH ENCRYP TION 可防止将触发器作为SQL Server复制的一部分发布。 AFTER 指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。 如果仅指定FOR 关键字,则AFTER是默认设置。 不能在视图上定义AFTER 触发器。

SQL触发器实例讲解

SQL触发器实例讲解 SQL 资料2009-07-23 14:44:07 阅读6072 评论9 字号:大中小订阅 定义:何为触发器?在SQL Serv er里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... ) 用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student --在Student表中创建触发器 f or 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

SQL游标及触发器实例

SQL Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Declare @barCode varchar(50)--声明变量用于存放游标结果 DECLARE CsrName CURSOR FOR--声明游标 select barCode from eachBook --游标数据来源 BEGIN OPEN CsrName --打开游标 FETCH FROM CURSUBOK INTO @barCode--获得来源的一行记录放入变量 WHILE @@FETCH_STATUS = 0 BEGIN -----------------------------------------------------针对每个结果做的操作 print @barcode ----------------------------------------------------------------------------End FETCH NEXT FROM CsrName INTO @barCode --处理下一行数据 CLOSE CsrName --游标用完了要关掉 END 总结:一般sql语句是面向集合的,游标是面向集合里面的行的,相当于获取一行数据->处理->获得下一行数据->处理这样一个循环。能不用游标就尽量不要用游标,性能很烂 --两种触发器,after为表sql语句执行之后操作,INSTEAD OF为之前操作 create trigger tgr_name--创建触发器 on classes --在classes表上 for insert--当classes表插入数据是触发as里面的操作(for 有after默认值,所以是sql 语句执行完了执行) --,有insert、update、delete三种操作类型。 as declare @id int;--定义变量用来临时存放数据 select @id = id from inserted; --在inserted表中查询已经插入记录信息,update就有个updated表,deleted就是deleted表 print '刚刚插入的记录的ID是'+@id; GO

SQLServer触发器使用实例

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, --借出时间

SQL_Server数据库设计的案例分析

数据库设计的案例分析 一、教学管理 1. 基本需求 某学校设计学生教学管理系统。学生实体包括学号、姓名、性别、生日、民族、籍贯、简历、登记照,每名学生选择一个主修专业,专业包括专业编号和名称,一个专业属于一个学院,一个学院可以有若干个专业。学院信息要存储学院号、学院名、院长。教学管理还要管理课程表和学生成绩。课程表包括课程号、课程名、学分,每门课程由一个学院开设。学生选修的每门课程获得一个成绩。 设计该教学管理的ER模型,然后转化为关系模型。 若上面的管理系统还要管理教师教学安排,教师包括编号、姓名、年龄、职称,一个教师只能属于一个学院,一名教师可以上若干门课程,一门课程可以有多名老师来上,每个教师所上的每门课都有一个课堂号和课时数。试修改上题的ER模型,将教师教学信息管理增加进去。

2. 参考设计: 图一教学管理ER图 由ER模型转换的关系模型是: 学生(学号,姓名,性别,生日,民族,籍贯,专业号,简历,登记照)专业(专业号,专业,专业类别,学院号) 学院(学院号,学院,院长) 课程(课程号,课程名,学分,学院号) 成绩(学号,课程号,成绩) (题目分析:本题中有学生、专业、学院、课程四个实体。一个学生只有一个主修专业,学生与专业有多对一的联系;一个专业只由一个学院开设,一门课程只由一个学院开设,学院与专业、学院与课程都是一对多的联系;学生与课程有多对多的联系。 在转换为关系模型时,一对多的联系都在相应的多方实体的关系中增加一个外键。) 增加教师,ER图如下。

图二有教师实体的教学管理ER图 3. 物理设计 基于Access的数据库结构设计如下。 指定数据库文件的名称,并为设计好的关系模型设计表结构。 数据库文件保存在“E:\教学管理\”文件夹中,数据库文件名:教学管理.MDB。 表包括:学院、专业、学生、课程、成绩单。对应表结构如表1-2至表1-6所示。 表1-1 学院 表1-2 专业 表1-3 学生

SQL Server 触发器

SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 ?什么是触发器 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 DML触发器分为: 1、after触发器(之后触发) a、insert触发器 b、update触发器 c、delete触发器 2、instead of 触发器(之前触发) 其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数

据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。 对表的操作Inserted逻辑表Deleted逻辑表 增加记录(insert)存放增加的记录无 删除记录(delete)无存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录 Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。 ?创建触发器 语法 create trigger tgr_name on table_name with encrypion –加密触发器 for update... as Transact-SQL # 创建insert类型触发器 --创建insert插入类型触发器 if (object_id('tgr_classes_insert', 'tr') is not null) drop trigger tgr_classes_insert go create trigger tgr_classes_insert

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_name ON { table | view } [ WITH ENCRYPTION ] { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]} AS sql_statement [...n ] } 触发器示例: ?CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE AS RAISERROR (50009, 16, 10) 指定触发器何时激发 ?AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激 发。可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。 ?INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。 ?对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个 INSTEAD OF 触发器。而一个表对于每个触发操作可以有多个AFTER 触发器。 触发器示例: create TRIGGER reminder ON titles FOR INSERT, delete,update AS --修改操作 if (select count(*) from inserted) > 0 and (select count(*) from deleted) >0 begin RAISERROR ('修改成功', 16, 10) end

sqlserver SQL触发器的使用及语法

定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) 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分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

SQLServer-触发器使用实例

SQLServer-触发器使用实例

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), --流水号

sqlserver 触发器示例

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

SQL Server 触发器

SQL Server 触发器 测试表 1> CREATE TABLE test_trigger_table ( 2> id INT, 3> name VARCHAR(10), 4> val INT 5> ); 6> go INSERT 注:SQL Server 中。没有BEFORE INSERT 或者AFTER INSERT 根据文档显示,以及代码的测试。基本上类似于Oracle 的AFTER INSERT SQL Sercer 触发器没有FOR EACH ROW 关键字一次更新一条,还是多条,取决于 INSERTED 里面的内容。 1> CREATE TRIGGER BeforeInsertTest 2> ON

test_trigger_table 3> FOR INSERT 4> AS 5> DECLARE 6> @Id INT, 7> @Name VARCHAR(10); 8> BEGIN 9> PRINT('BEFORE INSERT'); 10> SELECT @Id = id, @Name = name FROM INSERTED; 11> PRINT('New Name = ' + @Name); 12> UPDATE test_trigger_table SET val = 100 WHERE id=@Id; 13> END; 14> go 1> 2> INSERT INTO test_trigger_table(id, name) VALUES (1,

相关主题
文本预览
相关文档 最新文档