精华内容
下载资源
问答
  • 如何在SQL Server中使用触发器

    千次阅读 2009-02-16 11:54:00
    如何在SQL Server中使用触发器 触发器是一种特殊的存储过程,在使用触发器之前可以与存储过程进行比较,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。 触发器是一种特殊的...

    如何在SQL Server中使用触发器

    触发器是一种特殊的存储过程,在使用触发器之前可以与存储过程进行比较,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。

     

    触发器是一种特殊的存储过程,在使用触发器之前可以与存储过程进行比较,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。

    触发器主要优点如下:

    触发器是自动的:当对表中的数据作了任何修改之后立即被激活,触发器与数据库中的表紧密相关,比如当对表执行INSERT、UPDATE或DELETE操作时,触发器就会自动执行。

    触发器可以对数据库中的表进行嵌套的触发,一个触发器执行启动另一个触发器的操作,这样的嵌套可以达到32层。

    触发器可以强制限制,可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制,虽CHECK约束已经在表定义的时候建立好了,但触发器可以实现很多其它的约束限制,在约束所支持的功能无法满足应用程序的功能要求时,触发器的优点就会体现。

    在SQL Server中,已经包括两大类触发器:DML 触发器和 DDL 触发器。 DDL触发器为SQL Server 2005中新增的。

    当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误,则整个事务即自动回滚。

    DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库中执行管理任务,例如,审核以及规范数据库操作。像常规触发器一样,DDL 触发器将激发存储过程以响应事件。但与 DML 触发器不同的是,它们不会为响应针对表或视图的 UPDATE、INSERT 或 DELETE 语句而激发。相反,它们会为响应多种数据定义语言 (DDL) 语句而激发。这些语句主要是以 CREATE、ALTER 和 DROP 开头的语句。DDL 触发器可用于管理任务,例如审核和控制数据库操作。

    了解到以上内容,我们就来看一下如何来创建一个DML触发器和一个DDL触发器。

    在SQL Server 2000中我们创建触发器可以通过在表名上点右键->“所有任务”->“管理触发器”来创建,然后在里面写上对应的 T-SQL 语句,也可以在查询分析器里面创建。在SQL Server 2005中就不提供对应的表名进行操作了,需要直接通过写对应的T-SQL语句了。

    触发器的操作命令主要有如下几种格式:

    创建触发器:

    Create Trigger 名称

    On 表名

    For 类型

    As

    Sql语句

    修改触发器:

    Alter Trigger 名称

    删除触发器:

    Drop Trigger 名称

    先来看一个DML触发器:

    现在有两张表,一张是学生的基本信息表,一张是他所借书的表(表里面和学生基本信息表关联的是学号),现在业务如下:更改了学生的学号,同时也要更改所借书表的学号;该学生毕业后,删除他的学号时,同时也删除它的借书的记录。

    我们就来创建这样的触发器,先来描述更改学生的学号同时更改所借书的学号:

     

    CreateTriggerTrgStudentInfoUpdate

    OnStudentInfo--在StudentIno表中创建触发器

    ForUpdate--为更新事件触发

    As

    ifUpdate(StudentNumber)--更新了学号后

    Begin

    UpdateBorrowBook--更新借书的记录表

    SetStudentNumber=StudentInfo.StudentNumber

    FromBorrowBook,StudentInfo

    WhereBorrowBook.StudentNumber=StudentInfo.StudentNumber

    End

    然后再来看看删除学号时同时删除它的借书记录:

    CreatetriggerTrgStudentInfoDelete

     

    OnStudentInfo--在StudentIno表中创建触发器

    ForDelete--为删除事件触发

    As

    DeleteBorrowBook--删除学生信息时同时删除他的借书记录表信息

    FromBorrowBook,StudentInfo

    WhereBorrowBook.StudentNumber=StudentInfo.StudentNumber

     

    以上就是DML的触发器,下面来看DDL的触发器,我们可以看SQLServer2005自带的一个例子的用法:

    CREATETRIGGERsafety

     

    ONDATABASE

    FORDROP_TABLE,ALTER_TABLE–-在删除或对表进行更新时

    AS

    PRINT'YoumustdisableTrigger"safety"todroporaltertables!'–-提示信息

    ROLLBACK–-回滚

    ;

    以上示例说明了如何使用 DDL 触发器来防止数据库中的任一表被修改或删除,当任何一张表在被修改或删除的时候,都会触发到相应的事件。

    触发器在给我们带来操作方便的同时,也需要慎用它,如果过分的依赖触发器,很大程度上就会影响到数据库的结构,增加了维护的复杂度。

    展开全文
  • SQL server中使用触发器

    2019-05-05 15:38:55
    触发器 是一特殊的存储过程,通过事件触发而执行的 可以实现比primary key,foregin key,check,unique,default更加复杂的数据完整性约束 DML触发器:insert,delete,update DDL触发器:create,alter,drop 两个特殊表...

    触发器

    • 是一特殊的存储过程,通过事件触发而执行的
    • 可以实现比primary key,foregin key,check,unique,default更加复杂的数据完整性约束
    • DML触发器:insert,delete,update
    • DDL触发器:create,alter,drop

    两个特殊表(deleted,inserted):系统自动管理,动态驻留内存中

     

    1.DML触发器

    为什么使用触发器呢?先来看一个示例代码

    --视图:学号,姓名,课程号,课程名,成绩
    create view view1
    as
     select Student.Sno,Sname,Course.Cno,Cname,Grade
     from  Student,SC,Course
     where Student.Sno=SC.Sno and Course.Cno=SC.Cno
    
    select * from view1
    
    
    --插入数据,会提示错误,不可更新
    insert into view1 values('2015005','005','5','python',100)

    --结果会提示错误,因为修改会影响多个基表,因此可利用触发器,解决

    --视图上只能创建instead of 触发器
    create trigger tri_view1 on view1 instead of insert
    as
    		insert into Student(Sno,Sname) select Sno,Sname from inserted		
    		insert into Course(Cno,Cname) select Cno,Cname from inserted
    		insert into SC(Sno,Cno,Grade) select Sno,Cno,Grade from inserted
    
    
    --测试触发器
    insert into view1 values('2015005','005','5','python',100)
    
    
    select * from Student
    select * from Course
    select * from SC
    

    注:在视图上只能创建instead of触发器,不能创建after触发器;在基本表上可以创建instead of触发器和after触发器

     

    2.DDL,DDL事件组

    create...,alter...,drop...

    create trigger tri_safe on database
    --for create_table,drop_table,alter_table
    for ddl_table_events --事件组
    as
    		print('数据表上的DDL触发器执行啦')
    		print('您无法再该石油加油卡上创建表和创建表')
    		rollback
    --测试
    create table test_table(
    		no char(8),
    		name char(20)
    		)
    select * from test_table
    

    3.服务器触发器

    create trigger tri_CheckLogin on all server 
     for  ddl_table_events
     as
    		rollback
    		print('不能再该数据库上创建,删除,修改登录账号')
    
    create login aa with password='sa123'
    
    --禁用
    disable trigger all on all server
    

    4.触发器运用示例

    1)创建 DDL 触发器,禁止用户修改 BooksDB 数据库中的表;

    实现代码:

    创建 DDL 触发器,禁止用户修改 BooksDB 数据库中的表; 
    create trigger tri_safe on Database
    --for create_table,drop_table,alter_table
    for ddl_table_events
    as
    	rollback
    	print('DDL触发器执行啦')
    	print('您无法在该数据库上修改表')
    go
    --测试
    drop table Borrow

    运行结果:

    注:go--是批处理结束的语句.批处理:一条或多条SQL语句,一次性发送到SQL sever数据库服务器进行执行,SQL server数据库服务器讲批处理的语句编译成一个可执行单元,称为执行计划,当编译错误的时候不会执行;运行时错误;

    2)测试 AFTER 触发器,理解 INSERTED 表和 DELETED 表的作用;

    实现代码:

    --测试 AFTER 触发器,理解 INSERTED 表和 DELETED 表的作用;
    create trigger tri_testAfter on Borrow
    for insert,delete
    as
      select * from inserted
    	select * from deleted
    	print'Borrow表上的afetr触发器执行啦!'
    
    --测试
    
    insert into Borrow values('rd2018007','bk2018001',GETDATE(),GETDATE()+10,default)
    
    select * from Borrow
    
    delete Borrow where rdId='rd2018007'

    运行结果:

    思考题1: 请在SC表上创建一个触发器,当删除SC表中的选课记录时,要求平均成绩表自动更新

    实现代码:

    --思考:请在SC表上创建一个触发器,当删除SC表中的选课记录时,要求平均成绩表自动更新
    
    --创建平均成绩表
    select sno,avg(Grade) avgGrade into avgTable from SC group by sno
    
    --创建触发器
    create trigger tri_delSC on SC
    for delete
    as
    	print'SC表上的delete触发器执行啦!'
    	declare @sno char(9)
    	set @sno=(select Sno from deleted)	
    	update avgTable set avgGrade=(select avg(Grade) from SC  where sno=@sno group by sno) where sno=@sno
    	print'平均成绩表更新啦'
    
    --测试执行
      select * from avgTable
    	select * from SC
    	delete SC where sno='2017003' and Cno='2'
    --查看数据
      select * from avgTable
    	select * from SC

    运行结果:

    思考题2: 请在SC表上创建一个触发器,当更新SC表中的选课成绩时,要求平均成绩表自动更新

    实现代码:

    --思考:请在SC表上创建一个触发器,当更新SC表中的选课成绩时,要求平均成绩表自动更新
    
    
    select sno,avg(Grade) avgGrade into avgTable from SC group by sno
    
    
    create trigger tri_updateSC on SC
    for update
    as
    	print'SC表上的update触发器执行啦!'
    	declare @sno char(9)
    	set @sno=(select Sno from inserted)	
    	update avgTable set avgGrade=(select avg(Grade) from SC  where sno=@sno group by sno) where sno=@sno
    	print'平均成绩表更新啦'
    
    --测试执行
    
      select * from avgTable
    	update SC set Grade=99 where sno='2017003' and Cno='1'
    --查看数据
      select * from avgTable
    	select * from SC

    运行结果:

    展开全文
  • sql 会话This article will focus on the various ways to disable triggers in SQL Server so they won’t ... 本文将重点介绍在SQL Server中禁用触发器的各种方法,以使它们不会干扰诸如批量插入之类的某些...

    sql 会话

    This article will focus on the various ways to disable triggers in SQL Server so they won’t interfere with certain operations like bulk inserts.

    本文将重点介绍在SQL Server中禁用触发器的各种方法,以使它们不会干扰诸如批量插入之类的某些操作。

    问题 (Problem)

    We had a situation where we need to load data into the tables in one of our database. There were a few triggers created on these tables for insert, update and delete and these triggers are set as “NOT FOR REPLICATION”. While loading data into the tables we do not want these triggers to be fired. We thought of disabling the triggers on the tables but this will disable them for other user transactions as well. We want them not to be fired only for my session from which I am executing data loading script. In this article let see how to disable triggers in SQL Server for a specific.

    我们遇到一种情况,需要将数据加载到数据库之一的表中。 在这些表上创建了一些用于插入,更新和删除的触发器,这些触发器设置为“ NOT FOR REPLICATION”。 在将数据加载到表中时,我们不希望触发这些触发器。 我们曾考虑过禁用表上的触发器,但这也会对其他用户事务也禁用它们。 我们希望不要仅针对我正在执行数据加载脚本的会话触发它们。 在本文中,让我们看看如何在特定SQL Server中禁用触发器。

    (Solution)

    We need to understand about “NOT FOR REPLICATION” concept in SQL Server first.

    我们首先需要了解SQL Server中的“ NOT FOR REPLICATION”概念。

    NOT FOR REPLICATION can be used while creating triggers in SQL Server. This indicates that these triggers are not fired when replication agent do data modifications (INSERT / UPDATE / DELETE) on the table.

    在SQL Server中创建触发器时可以使用NOT FOR REPLICATION。 这表明当复制代理对表进行数据修改(INSERT / UPDATE / DELETE)时,不会触发这些触发器。

    Not only for triggers in SQL Server, this hint can also be used while creating foreign keys, identity columns and check constraints.

    不仅对于SQL Server中的触发器,此提示还可以在创建外键,标识列和检查约束时使用。

    In case of foreign keys, the foreign key check happens only when a user modify data on the table and foreign key validation does not happen when the replication agent sync’s these modifications to the other end (either to subscriber or both subscriber and publisher based on the type of replication configured)

    如果是外键,则仅当用户修改表上的数据时才进行外键检查,并且当复制代理将这些修改同步到另一端(基于订阅者的订阅者或订阅者和发布者)时,不进行外键验证。配置的复制类型)

    In case of identity columns, a new identity value is not generated when replication agent insert data into the table and the original identity value which is generated at source is used.

    对于标识列,当复制代理将数据插入表中并且使用在源处生成的原始标识值时,不会生成新的标识值。

    As the triggers in SQL Server were created with “NOT FOR REPLICATION” on these tables, if we insert data into the table as a normal user these triggers were fired. These triggers were not fired when replication agent inserts, deletes and updates data on the tables. So, pretending as a replication agent will do my job. (i.e. the triggers were fired for all user sessions and not fired for specific session which I logged in as replication agent.)

    由于SQL Server中的触发器是在这些表上使用“ NOT FOR REPLICATION”创建的,因此,如果我们以普通用户的身份将数据插入表中,则会触发这些触发器。 当复制代理在表中插入,删除和更新数据时,不会触发这些触发器。 因此,假装为复制代理将完成我的工作。 (即,触发器是针对所有用户会话触发的,而不是针对我以复制代理身份登录的特定会话触发的。)

    To illustrate this, I will create two sample tables “Emp” and “EmpJoining” and a trigger on “Emp” table which is fired to insert joining date when a new row is inserted in “Emp” table.

    为了说明这一点,我将创建两个示例表“ Emp”和“ EmpJoining”,并在“ Emp”表上创建一个触发器,当在“ Emp”表中插入新行时,触发该触发器以插入加入日期。

    CREATE TABLE Emp ( Empid int , name varchar (50) )
    GO
    CREATE TABLE EmpJoining ( Empid int, JD datetime)
    GO
    CREATE TRIGGER TR_INSEMPDETAILS ON Emp
    FOR INSERT
    NOT FOR REPLICATION
    AS
    BEGIN
    SET NOCOUNT ON
    INSERT INTO EmpJoining
    SELECT Empid , GETDATE() FROM inserted
    END
    GO
    

    Now for example, I have the employee id, name and their joining date in other system which needs to be imported into above existing tables. In this case I do not want the trigger logic to be fired when I am inserting data into Emp table.

    现在,例如,在其他系统中,我需要输入员工ID,姓名及其加入日期,该系统需要导入到现有表中。 在这种情况下,我不希望在将数据插入Emp表时触发触发器逻辑。

    Basically, I have T-SQL insert script for both these tables which inserts employee id name in “Emp” table and their joining dates in “EmpJoining” table.

    基本上,对于这两个表,我都有T-SQL插入脚本,它们在“ Emp”表中插入员工ID名称,并在“ EmpJoining”表中插入其加入日期。

    Let us log in as normal user and execute T-SQL script to insert data into the table.

    让我们以普通用户身份登录并执行T-SQL脚本以将数据插入表中。

    以普通用户身份登录: (Login as normal user:)

    Open SQL Server management studio. Now login to the SQL Server as a normal user and use the database where you created table. Use below script to insert data into Emp table and check whether trigger is fired or not.

    打开SQL Server管理工作室。 现在,以普通用户身份登录到SQL Server,并使用创建表的数据库。 使用以下脚本将数据插入到Emp表中,并检查是否触发了触发器。

    INSERT INTO Emp ( Empid , name ) values ( 1 , 'Adam' )
     
    select * from Emp
     
    select * from EmpJoining
    

    we can see the trigger is fired and inserted data in EmpJoining table.

    我们可以看到触发了触发器并在EmpJoining表中插入了数据。

    We can check the session property using below script.

    我们可以使用以下脚本检查session属性。

    select SESSIONPROPERTY ( 'replication_agent' )
    

    it will return zero if we login as normal user and it returns one if we login as replication agent.

    如果以普通用户身份登录,它将返回零;如果以复制代理身份登录,则返回1。

    作为复制代理登录的步骤: (Steps to Login as replication agent:)

    Now let us login as replication agent and insert data using script.

    现在,让我们以复制代理身份登录并使用脚本插入数据。

    Close SQL server management studio and re-open it.

    关闭SQL Server Management Studio,然后重新打开。

    Input server, login, and password you want to use. click on options. Please refer to below image.

    输入您要使用的服务器,登录名和密码。 单击选项。 请参考下图。

    Navigate to additional connection parameters tab. In additional connection parameters table enter REPLICATION=TRUE in text box as shown in the below image.

    导航到其他连接参数选项卡。 在其他连接参数表中,在文本框中输入REPLICATION = TRUE,如下图所示。

    You can use your preferred login method either windows authentication or SQL Server authentication.

    您可以使用Windows身份验证或SQL Server身份验证的首选登录方法。

    This will login you as replication agent and any DML operation you perform on table will be executed as replication agent.

    这将使您登录为复制代理,并且您在表上执行的任何DML操作都将作为复制代理执行。

    Now execute below query to check whether you are logged in as a replication agent or not.

    现在,执行以下查询以检查您是否以复制代理身份登录。

    select SESSIONPROPERTY ( 'replication_agent' )
    

    It should return 1.

    它应该返回1。

    Now insert few rows using below script.

    现在,使用以下脚本插入几行。

    INSERT INTO Emp ( Empid , name ) values ( 2 , 'Greg' )
    select * from Emp
     
    select * from EmpJoining
    

    We can see the trigger is not fired as we logged in as replication agent and trigger is set as “NOT FOR REPLCIATION”.

    我们可以看到以复制代理身份登录时触发器未触发,并且触发器设置为“ NOT FOR REPLCIATION”。

    The data is inserted in only Emp table. Please refer to below image.

    数据仅插入到Emp表中。 请参考下图。

    Here in this case the trigger is not disabled and available for other user transactions which will fire trigger when there is an INSERT. The trigger is not fired only for the transaction which is executed as replication agent.

    在这种情况下,触发器不会被禁用,并且可用于其他用户事务,当存在INSERT时将触发触发器。 仅针对作为复制代理执行的事务不会触发该触发器。

    Use below query to check if your trigger is marked as “NOT FOR REPLCIATION” or not.

    使用以下查询来检查触发器是否标记为“ NOT FOR REPLCIATION”。

    SELECT name,is_not_for_replication FROM SYS.triggers
    

    There are other ways to disable triggers in SQL Server for a session by handling code with conditions.

    还有其他方法可以通过处理有条件的代码来禁用SQL Server中的会话触发器。

    For example you can use CONTEXT_INFO() in the trigger code and return. Using CONTEXT_INFO() requires no special permissions.

    例如,您可以在触发代码中使用CONTEXT_INFO()并返回。 使用CONTEXT_INFO()不需要特殊权限。

    In this case, If the CONTEXT_INFO matches with value specified in the trigger the trigger returns and does not execute code below. Please refer to below code.

    在这种情况下,如果CONTEXT_INFO与触发器中指定的值匹配,则触发器将返回并且不执行下面的代码。 请参考下面的代码。

    CREATE TRIGGER TR_INSEMPDETAILS ON Emp
    FOR INSERT
    AS
    BEGIN
    SET NOCOUNT on
    DECLARE @CONT_INFO VARBINARY(128) 
    SELECT @CONT_INFO = CONTEXT_INFO() 
    IF @CONT_INFO = 0x1256698456
    RETURN
    INSERT INTO EmpJoining
    SELECT Empid , GETDATE() FROM inserted
    END
    

    In this case we must set the context_info value to 0x1256698456 before inserting data into the table “Emp”.

    在这种情况下,我们必须在将数据插入表“ Emp”之前将context_info值设置为0x1256698456。

    The following system views also store the context information, but querying these views directly requires SELECT and VIEW SERVER STATE permissions.

    以下系统视图也存储上下文信息,但是直接查询这些视图需要SELECT和VIEW SERVER STATE权限。

    • sys.dm_exec_requests

      sys.dm_exec_requests
    • sys.dm_exec_sessions

      sys.dm_exec_sessions
    • sys.sysprocesses

      sys.sysprocesses

    Instead of T-SQL INSERT script, let us assume the data is .txt file or .csv file. We can use BCP UTILITY or BULK INSERT options to load data into tables without firing the triggers.

    代替T-SQL INSERT脚本,让我们假设数据是.txt文件或.csv文件。 我们可以使用BCP UTILITY或BULK INSERT选项将数据加载到表中,而无需触发触发器。

    使用BCP实用程序 (Using BCP utility)

    We can use BCP utility to load bulk data into table without firing triggers in SQL Server. This method will work only for INSERTS on the table and do not fire triggers created “for insert” and “instead of insert”.

    我们可以使用BCP实用程序将批量数据加载到表中,而无需在SQL Server中触发触发器。 此方法仅适用于表上的INSERTS,并且不会触发“用于插入”和“代替插入”创建的触发器。

    By default, BCP utility does not fire triggers on loading data into tables. To force trigger execution, we should use -h “FIRE_TRIGGERS” in BCP while loading data into table.

    默认情况下,BCP实用程序不会在将数据加载到表中时触发触发器。 为了强制执行触发器,在将数据加载到表中时,我们应该在BCP中使用-h“ FIRE_TRIGGERS”。

    Below are sample tables used in this example.

    以下是此示例中使用的示例表。

    CREATE TABLE USERS
    (ID int,
    NAME varchar(50))
     
     
    CREATE TABLE USERHIST
    (USERID int,
    CREATEDDATE datetime )
     
     
    CREATE TRIGGER INS_USERS ON USERS
    FOR INSERT
    AS
    BEGIN
    INSERT INTO USERHIST
    SELECT ID,GETDATE() FROM INSERTED
    END
    

    Please refer to the below example of default BCP to load data into “USERS” table which will not fire triggers in SQL Server. I have masked the original server, database names and login credentials.

    请参考下面的默认BCP示例,以将数据加载到“ USERS”表中,该表不会在SQL Server中触发触发器。 我掩盖了原始服务器,数据库名称和登录凭据。

    bcp [testdb].dbo.USERS in D:\bcp.txt -T -c -S”SERVERNAME” -Uusername -Ppassword

    D:\ bcp.txt中的bcp [testdb] .dbo.USERS -T -c -S“ SERVERNAME” -Uusername -Ppassword

    Please refer to the below example of BCP with hint “FIRE_TRIGGERS” to load data into USERS table which will fire triggers.

    请参考以下带有提示“ FIRE_TRIGGERS”的BCP示例,将数据加载到USERS表中,这将触发触发器。

    bcp [testdb].dbo.USERS in D:\bcp.txt -T -c -S”SERVERNAME” -Uusername -Ppassword -h “FIRE_TRIGGERS”

    D:\ bcp.txt中的bcp [testdb] .dbo.USERS:-T -c -S“ SERVERNAME” -Uusername -Ppassword -h“ FIRE_TRIGGERS”

    使用批量插入 (Using BULK INSERT)

    This option also will work only for INSERTS on the table and do not fire triggers created “for insert” and “instead of insert”.

    此选项也仅适用于表上的INSERTS,并且不会触发“用于插入”和“代替插入”创建的触发器。

    By default, BULK INSERT does not fire triggers in SQL Server. We can force the execution of trigger by specifying “FIRE_TRIGGERS”

    默认情况下,BULK INSERT不会在SQL Server中触发触发器。 我们可以通过指定“ FIRE_TRIGGERS”来强制执行触发器

    I have test.txt file which as data with “,” as FIELDTERMINATOR.

    我有test.txt文件,其中的数据以“,”作为FIELDTERMINATOR。

    Please refer to below code for default BULK INSERT to load data into USERS table which will not fire triggers in SQL Server.

    请参考下面的代码以获取默认的BULK INSERT,以将数据加载到USERS表中,该表不会在SQL Server中触发触发器。

    BULK 
    INSERT USERS
    FROM 'D:\\test.txt' --location with filename
    WITH
    (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
    )
    GO
    

    Please refer to the below code with hint “FIRE_TRIGGERS” which will fire triggers in SQL Server when loading data from test.txt file.

    请参考以下带有提示“ FIRE_TRIGGERS”的代码,当从test.txt文件加载数据时,它将触发SQL Server中的触发器。

    BULK 
    INSERT USERS
    FROM 'D:\\test.txt' --location with filename
    WITH
    (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    FIRE_TRIGGERS
    )
    GO
    

    In this article we discussed the behavior of triggers in SQL Server for below cases.

    在本文中,我们讨论了以下情况下SQL Server中触发器的行为。

    1. Login as normal user.

      以普通用户身份登录。
    2. Login as replication agent and trigger is set as not for replication.

      以复制代理身份登录,并将触发器设置为不复制。
    3. Using CONTEXT_INFO function in the trigger code.

      在触发代码中使用CONTEXT_INFO函数。
    4. Using BCP default and with hint “FIRE_TRIGGER”

      使用默认的BCP并带有提示“ FIRE_TRIGGER”
    5. Using BULK INSERT default and with hint “FIRE_TRIGGER”

      使用默认的BULK INSERT并带有提示“ FIRE_TRIGGER”

    For points 3, 4 and 5 no matter if we create triggers with “NOT FOR REPLICATION” or not.

    对于第3点,第4点和第5点,无论我们是否创建带有“ NOT FOR REPLICATION”的触发器。

    翻译自: https://www.sqlshack.com/disabling-triggers-in-sql-server-for-a-specific-session/

    sql 会话

    展开全文
  • SqlServer 触发器

    2019-01-28 20:29:00
    SqlServer 触发器实现多表之间同步增加、删除与更新 定义: 何为触发器SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:...

    SqlServer 触发器实现多表之间同步增加、删除与更新

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
    常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

     

    触发器的使用模版如下

     

    CREATE TRIGGER 触发器名称 
    ON 表名称
    AFTER INSERT /UPDATE/DELETE
    AS 
    
    BEGIN INSERT INTO 
    B表(B表字段1,B表字段2,B表字段3)
    SELECT A表字段1,A表字段2,A表字段3 
    FROM INSERTED/DELETED
    END
    

     

      

     

     

    新建两张表,如下,第一张是操作表,第二张表是为了测试触发器效果的

    create table dbo.testtable(
    id int identity (1,1),
    name varchar(20))
    
    create table dbo.htesttable(
    id int identity (1,1),
    name varchar(20),
    timerecord datetime,
    updatedt datetime)
    

     

    新增的触发器

    CREATE TRIGGER [DBO].[TRG_TESTTABLE_INSERT] ON [DBO].[TESTTABLE] AFTER INSERT AS
    BEGIN
    
    INSERT INTO HTESTTABLE 
    SELECT I.NAME+'INSERT' ,GETDATE(),GETDATE()
    FROM INSERTED I 
        
    END
    

    更新的触发器

     

    ALTER/Create  TRIGGER [dbo].[TRG_TESTTABLE_update] ON [dbo].[testtable] AFTER update AS
    BEGIN
    
    INSERT INTO HTESTTABLE 
    SELECT I.NAME + 'update',getdate(),getdate()
    FROM deleted I 
    
    INSERT INTO HTESTTABLE 
    SELECT I.NAME + 'update2',getdate(),getdate()
    	FROM inserted I 
        
    END
    

     

    解释:
    在删除(delete)数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted
    而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。

    更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,
    这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了;

    有的时候两个表是主外键关系,想删除主表数据的同时把子表相关的数据也删除,
    这个时候如果用触发器就没有效果了,因为这个触发器是在你删除表后才触发的,
    这个时候直接终止,提示“有主外键关系,不能删除等”,所有这样的删除触发器是没有效果的

     

      

     

    删除的触发器

    CREATE   TRIGGER [DBO].[TRG_TESTTABLE_DELETE] ON [DBO].[TESTTABLE] AFTER DELETE AS
    BEGIN
    
    INSERT INTO HTESTTABLE 
    SELECT D.NAME + 'DELETE',GETDATE(),GETDATE()
    FROM DELETED D
        
    END
    

     

     

     

    如果需要对触发器重命名,只要记住触发器是特殊的存储过程即可,命令如下

    exec sp_rename oldxxx, newxxx

    如何查询触发器

    SELECT * FROM SYSOBJECTS WHERE XTYPE='TR'

    禁用:alter table 表名 disable trigger 触发器名称
    启用:alter table 表名 enable trigger 触发器名称

     

    转载于:https://www.cnblogs.com/qianjinyan/p/10330717.html

    展开全文
  • SQLServer删除触发器

    万次阅读 2018-10-22 15:53:05
    删除触发器时,会从 sys.objects、sys.triggers 和 sys.sql_modules 目录视图中删除有关该触发器的信息。 仅当所有触发器使用相同的 ON 子句创建时,才能使用一个 DROP TRIGGER 语句删除多个 DDL 触发器。 若要....
  • SQL Server中触发器详解

    千次阅读 2017-12-21 17:20:27
    SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 Ø 什么是触发器  触发器对表...
  • SQL Server中触发器

    2020-07-26 23:31:54
    In this article, we will review triggers in SQL Server, different types of trigger events, trigger order and NOT FOR REPLICATION in triggers. A trigger is a database object that runs automatically...
  • Sqlserver中触发器

    2019-10-08 22:45:42
      触发器(trigger)是SQLserver来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行是由事件来触发,当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强...
  •  下面我摘录了SQL Server官方教程的一段关于触发器的文字,确实有用的一点文字描述。 可以定义一个无论何时INSERT语句向表插入数据时都会执行的触发器。 当触发INSERT触发器时,新的数据行就会被插入到...
  • sql server中触发器

    2012-03-16 11:10:36
    在SQL SERVER中存储过程是一个很重要的概念,很多时候需要用到。其实触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作( insert,...
  • 你可以将触发器理解成现实生活开关,触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是往表插入记录﹑更新记录或者删除记录时被自动地激活 它的分类,sqlserver 有两类触发器,DML触发器和DDL触发器...
  • SQL Server1创建触发器GOBEGINIF (object_id(‘WMY‘, ‘tr‘) is not null)DROP trigger WMYEND;GOCREATE TRIGGER WMYON StudentInstead of INSERTASBEGININSERT INTO Student (number,name) VALUES (1205,‘角色2...
  • 在SQLserver数据库中触发器中大致分为两种:DDL、DML触发器,即系统触发器与表触发器,系统触发器是对数据库对象进行操作的触发器,表触发器是对表格的增删改时候所进行的触发器这里我们就只说表的触发器。 表的...
  • SQL Server 触发器

    万次阅读 多人点赞 2019-05-27 23:29:27
    SQL Server 触发器
  • 发现教材上的第五章中讲到的触发器Sql ...在SQL Server中create trigger的格式如下: <!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->use DB_namegocr
  • –禁用 代码如下:alter table tb disable trigger tir_name –...表的特定字段更新时,触发Update触发器SQLServer触发器创建、删除、修改、查看示例代码sqlserver中触发器+游标操作实现sqlserver 触发器教程使用Sqlser
  • 一:什么是触发器触发器就是类似 陷阱触发机关一样,设置好陷阱,踩到陷阱触发机关。数据库触发器一样的道理,设置好一个东西,规定情况下触发生效。 官方:通过事件满足后自动实现的一种特殊存储过程 二:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,919
精华内容 15,967
关键字:

在sqlserver中删除触发器用