澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

怎么配置指定的表,禁止删除数据表中指定行数

2019-07-22 作者:数据库网络   |   浏览(164)

转自:http://www.maomao365.com/?p=5323

触发器简要介绍:

触发器简单介绍:

摘要:
下文首要叙述,如何禁止删除数据表中钦定行数据

触发器是一种至极的寄存进程,它的实施不是由程序调用,亦不是手动实施,而是由事件来触发。触发器是当对某一个表举行操作。举个例子:update、insert、delete那一个操作的时候,系统会活动调用实施该表上相应的触发器。

触发器是一种非常的仓库储存进度,它的实践不是由程序调用,亦不是手动试行,而是由事件来触发。触发器是当对某二个表实行操作。比方:update、insert、delete那几个操作的时候,系统会自行调用执行该表上相应的触发器。

<span style="color:red;font-weight:bold;">
序言: 前日接到群友提问,怎样禁止某一张表里面包车型大巴数据被删去掉?
</span>
<hr />
当大家看见那个难点的时,首先想到的是拦截器,sql数据操作拦截器,首先第二个想到的是sql instead of触发器,
instead of触发器能够阻挡insert update delete操作。
下文将比方表达,instead of触发器对表删除的拦截  

<span style="color:red;font-weight:bold;">
前言: 前天接到群友提问,怎么着禁止某一张表里面包车型客车数量被去除掉?
</span>
<hr />
当我们看见这些难点的时,首先想到的是拦截器,sql数据操作拦截器,首先第一个想到的是sql instead of触发器,
instead of触发器能够阻挡insert update delete操作。
下文将比方表明,instead of触发器对表删除的掣肘  


触发器分类:

触发器分类:

/*建表*/
create table A(keyId int,info varchar(20))
go

insert into A(keyId,info)values(1,'a'),(2,'b'),(3,'c'),(4,'d')
go

/*创建 instead of 触发器*/
create trigger tr_A on A 
instead of delete 
as 
begin
select '禁止对表进行删除操作' ---将对表delete 全部锁定禁止操作
return;

/*
if system_user ='sa'
begin
select '禁止账户(sa)对表进行删除操作' 
return;

end
*/

end
go

delete from A 
go

select * from A 
go

truncate table A
drop table A 
go
/*建表*/
create table A(keyId int,info varchar(20))
go

insert into A(keyId,info)values(1,'a'),(2,'b'),(3,'c'),(4,'d')
go

/*创建 instead of 触发器*/
create trigger tr_A on A 
instead of delete 
as 
begin
select '禁止对表进行删除操作' ---将对表delete 全部锁定禁止操作
return;

/*
if system_user ='sa'
begin
select '禁止账户(sa)对表进行删除操作' 
return;

end
*/

end
go

delete from A 
go

select * from A 
go

truncate table A
drop table A 
go

近来收下用户多少个须求,禁止全体人删除”表A”中,ID 为1、2、3、4、5的类别私下认可数据,通过项目组同事留心钻探,我们获得一致的答案为:
在表上增加产量贰个触发器,当删除数据ID为 1 2 3 4 5时候,直接弹出相应的一无可取,选取这种格局,可以限制全部端口的非常操作(程序 查询解析器),
实际达成方式,如下文所示:

1、DML( 数据垄断(monopoly)语言 Data Manipulation Language)触发器:是指触发器在数据库中生出 DML 事件时将启用。DML事件是指在表或视图中对数码进行的 insert、update、delete 操作的话语。

1、DML( 数据垄断语言 Data Manipulation Language)触发器:是指触发器在数据库中生出 DML 事件时将启用。DML事件是指在表或视图中对数码实行的 insert、update、delete 操作的语句。

 

 

 

2、DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中发出 DDL 事件时将启用。DDL事件是指在表或索引中的 create、alter、drop 操作语句。

2、DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中产生 DDL 事件时将启用。DDL事件是指在表或索引中的 create、alter、drop 操作语句。

澳门新萄京官方网站 1

澳门新萄京官方网站 2


3、登录触发器:是指当用户登入 SQL SE纳瓦拉VEWrangler实例建设构造会话时接触。若是身份验证退步,登入触发器不会接触。

3、登入触发器:是指当用户登陆 SQL SE景逸SUVVESportage实例创建会话时接触。假如身份验证退步,登入触发器不会触发。

create trigger trTriggerA
on A
for delete
as
set nocount on
if exists (select 1 from deleted where id in (1,2,3,4,5) )
begin
RAISERROR ('禁止删除系统记录 1 2 3 4 5 ', 16, 1)
ROLLBACK TRANSACTION
end

里面 DML 触发器比较常用,依据 DML 触发器触发的不二秘籍不一样又分为以下三种意况:

里头 DML 触发器比较常用,依据 DML 触发器触发的点子各异又分为以下二种意况:

 

after 触发器(之后触发):当中 after 触发器需要独有进行insert、update、delete 某一操作之后触发器才会被触发,且不得不定义在表上。

after 触发器(之后触发):在那之中 after 触发器供给只有实行insert、update、delete 某一操作之后触发器才会被触发,且只好定义在表上。

instead of 触发器 (以前接触):instead of 触发器并不奉行其定义的操作(insert、update、delete)而仅是施行触发器自身。能够在表或视图上定义 instead of 触发器。

instead of 触发器 (以前接触):instead of 触发器并不进行其定义的操作(insert、update、delete)而仅是实践触发器自个儿。能够在表或视图上定义 instead of 触发器。

DML 触发器有八个奇特的表:插入表(instered)和删除表(deleted),这两张表是逻辑表。那多个表是创造在数据库服务器的内部存款和储蓄器中,並且两张表的都是只读的。这两张表的构造和触发器所在的数据表的构造是大同小异的。当触发器完结专门的学问后,这两张表就能够被删去。Inserted 表的数码是插入或是修改后的数额,而 deleted 表的数额是翻新前的可能已去除的多少。

DML 触发器有多个特殊的表:插入表(instered)和删除表(deleted),这两张表是逻辑表。那四个表是家徒壁立在数据库服务器的内存中,並且两张表的都以只读的。这两张表的结商谈触发器所在的数据表的构造是同样的。当触发器完结事业后,这两张表就能够被删去。Inserted 表的多少是插入或是修改后的多少,而 deleted 表的多寡是翻新前的恐怕已去除的数据。

澳门新萄京官方网站 3

澳门新萄京官方网站 4

AFTEEscort 触发器语法:

AFTE凯雷德 触发器语法:

 1 CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
 2 ON { table }   
 3 [ WITH <dml_trigger_option> [ ,...n ] ]  
 4 { FOR | AFTER }   
 5 { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
 6 AS { sql_statement  [ ; ] [ ,...n ] }  
 7 
 8 <dml_trigger_option> ::=  
 9     [ NATIVE_COMPILATION ]  
10     [ SCHEMABINDING ]  
11     [ EXECUTE AS Clause ]
 1 CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
 2 ON { table }   
 3 [ WITH <dml_trigger_option> [ ,...n ] ]  
 4 { FOR | AFTER }   
 5 { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
 6 AS { sql_statement  [ ; ] [ ,...n ] }  
 7 
 8 <dml_trigger_option> ::=  
 9     [ NATIVE_COMPILATION ]  
10     [ SCHEMABINDING ]  
11     [ EXECUTE AS Clause ]

INSTEAD OF 触发器语法:

INSTEAD OF 触发器语法:

 1 CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
 2 ON { table | view }   
 3 [ WITH <dml_trigger_option> [ ,...n ] ]  
 4 { FOR | AFTER | INSTEAD OF }   
 5 { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
 6 [ WITH APPEND ]  
 7 [ NOT FOR REPLICATION ]   
 8 AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  
 9 
10 <dml_trigger_option> ::=  
11     [ ENCRYPTION ]  
12     [ EXECUTE AS Clause ]  
13 
14 <method_specifier> ::=  
15     assembly_name.class_name.method_name  
 1 CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
 2 ON { table | view }   
 3 [ WITH <dml_trigger_option> [ ,...n ] ]  
 4 { FOR | AFTER | INSTEAD OF }   
 5 { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
 6 [ WITH APPEND ]  
 7 [ NOT FOR REPLICATION ]   
 8 AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  
 9 
10 <dml_trigger_option> ::=  
11     [ ENCRYPTION ]  
12     [ EXECUTE AS Clause ]  
13 
14 <method_specifier> ::=  
15     assembly_name.class_name.method_name  

DDL 触发器语法:

DDL 触发器语法:

1 CREATE [ OR ALTER ] TRIGGER trigger_name   
2 ON { ALL SERVER | DATABASE }   
3 [ WITH <ddl_trigger_option> [ ,...n ] ]  
4 { FOR | AFTER } { event_type | event_group } [ ,...n ]  
5 AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
6 
7 <ddl_trigger_option> ::=  
8     [ ENCRYPTION ]  
9     [ EXECUTE AS Clause ]  
1 CREATE [ OR ALTER ] TRIGGER trigger_name   
2 ON { ALL SERVER | DATABASE }   
3 [ WITH <ddl_trigger_option> [ ,...n ] ]  
4 { FOR | AFTER } { event_type | event_group } [ ,...n ]  
5 AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
6 
7 <ddl_trigger_option> ::=  
8     [ ENCRYPTION ]  
9     [ EXECUTE AS Clause ]  

登入触发器语法:

怎么配置指定的表,禁止删除数据表中指定行数据。登入触发器语法:

1 CREATE [ OR ALTER ] TRIGGER trigger_name   
2 ON ALL SERVER   
3 [ WITH <logon_trigger_option> [ ,...n ] ]  
4 { FOR| AFTER } LOGON    
5 AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
6 
7 <logon_trigger_option> ::=  
8     [ ENCRYPTION ]  
9     [ EXECUTE AS Clause ]  
1 CREATE [ OR ALTER ] TRIGGER trigger_name   
2 ON ALL SERVER   
3 [ WITH <logon_trigger_option> [ ,...n ] ]  
4 { FOR| AFTER } LOGON    
5 AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
6 
7 <logon_trigger_option> ::=  
8     [ ENCRYPTION ]  
9     [ EXECUTE AS Clause ]  

参数:

参数:

CREATE OR ALTER:

CREATE OR ALTER:

创办可能有法规的改换触发器(即要修改的触发器必须已经存在)。

创造只怕有标准的改造触发器(即要修改的触发器必须已经存在)。

schema_name:
DML触发器所属的方式的名目(即全体者,比方:dbo)。

schema_name:
DML触发器所属的形式的称呼(即全数者,比方:dbo)。

trigger_name:
是触发器的名目。

trigger_name:
是触发器的称号。

table | view:

table | view:

是实施 DML 触发器的表或视图,一时称为触发器表或触发器视图。钦赐表格或视图的一心限定名称是可选的。视图只可以由 INSTEAD OF 触发器援用。

是实行 DML 触发器的表或视图,有的时候称为触发器表或触发器视图。钦点表格或视图的一丝一毫限定名称是可选的。视图只可以由 INSTEAD OF 触发器援引。

DATABASE:
将 DDL 触发器的限定使用于方今数据库。假设钦点,触发器会在现阶段数据库中生出 event_type 或 event_group 时触发。

DATABASE:
将 DDL 触发器的限量使用于当下数据库。假使钦点,触发器会在当下数据库中产生 event_type 或 event_group 时触发。

ALL SERVER:

ALL SERVER:

将 DDL 或登陆触发器的功用域应用于当下服务器。如果钦点,触发器会在前段时间服务器的另外省方爆发 event_type 或 event_group 时触发。

将 DDL 或登入触发器的成效域应用于这段时间服务器。尽管钦命,触发器会在时下服务器的别样地点发生 event_type 或 event_group 时触发。

WITH ENCRYPTION:

WITH ENCRYPTION:

加密 CREATE T福睿斯IGGE翼虎 语句的文书。使用 WITH ENC本田UR-VYPTION 可防止卫触发器作为 SQL Server 复制的一有的实行表露。不或许为 CLEnclave 触发器钦定 WITH ENCRubiconYPTION。

加密 CREATE T陆风X8IGGE中华V 语句的公文。使用 WITH ENC凯雷德YPTION 可防止卫触发器作为 SQL Server 复制的一局部进行透露。不或许为 CL福睿斯 触发器钦点 WITH ENC途观YPTION。

EXECUTE AS:
点名施行触发器的平安上下文。以便能够调整 SQL Server 实例用于注明触发器援引的其他数据库对象的权位的用户帐户。

EXECUTE AS:
点名试行触发器的平安上下文。以便能够决定 SQL Server 实例用于注解触发器援引的其他数据库对象的权能的用户帐户。

NATIVE_COMPILATION:
意味着触发器是地点编写翻译的。

NATIVE_COMPILATION:
代表触发器是本土编写翻译的。

SCHEMABINDING:
点名触发器援用的表不可能被删除或退换。

SCHEMABINDING:
点名触发器引用的表不能被删去或转移。

FOR | AFTER:
AFTEENCORE 内定仅在触发 SQL 语句中钦赐的具备操作成功举办时触发 DML 触发器。全部援引级联操作和束缚检查在此触发器触发以前也不能够不成功。当 FO奇骏是内定的不今不古首要字时,AFTE宝马7系 是暗中同意值。视图不可能定义AFTE福睿斯触发器。

FOR | AFTER:
AFTE奥迪Q7 钦点仅在触发 SQL 语句中内定的装有操作成功施行时触发 DML 触发器。全部引用级联操作和自律检查在此触发器触发以前也无法不成功。当 FO凯雷德是点名的独一主要字时,AFTE途锐 是默许值。视图不可能定义AFTESportage触发器。

INSTEAD OF:
钦点施行 DML 触发器并不是触发 SQL 语句,因而覆盖触发语句的操作。不能为 DDL 或登陆触发器钦定 INSTEAD OF。

INSTEAD OF:
点名实施 DML 触发器并不是触发 SQL 语句,因而覆盖触发语句的操作。不也许为 DDL 或登陆触发器钦命 INSTEAD OF。

对于 INSTEAD OF 触发器,在颇具内定级联合浮动作 ON DELETE 的援用关系的表上不允许行使 DELETE 选项。类似地,在全部钦命级联合浮动作 ON UPDATE 的援用关系的表上,不一样意 UPDATE 选项。

对此 INSTEAD OF 触发器,在装有钦点级联合浮动作 ON DELETE 的引用关系的表上不相同意行使 DELETE 选项。类似地,在具有钦点级联合浮动作 ON UPDATE 的引用关系的表上,不容许 UPDATE 选项。

{[DELETE] [,] [INSERT] [,] [UPDATE]} :
点名在针对此表或视图进行尝试时激活 DML 触发器的数目修改语句。必须至少钦命四个抉择。在触发器定义中允许以任何顺序对那几个采纳举办大肆组合。

{[DELETE] [,] [INSERT] [,] [UPDATE]} :
点名在针对此表或视图举办尝试时激活 DML 触发器的数码修改语句。必须至少钦命二个抉择。在触发器定义中允许以任何顺序对这么些选取举行随机组合。

event_type:
是实行后产生 DDL 触发器触发的 Transact-SQL 语言事件的名称。

event_type:
是施行后导致 DDL 触发器触发的 Transact-SQL 语言事件的称呼。

event_group:
是 Transact-SQL 语言事件的预订义分组的名目。属于另外 Transact-SQL 语言事件实行后的 DDL 触发器触发 event_group。

event_group:
是 Transact-SQL 语言事件的预订义分组的称谓。属于别的 Transact-SQL 语言事件推行后的 DDL 触发器触发 event_group。

sql_statement:
是接触条件和动作。触发条件内定附加条件,以显著尝试的 DML,DDL 或登陆事件是还是不是产生实施触发器操作。

sql_statement:
是触发条件和动作。触发条件内定附加条件,以分明尝试的 DML,DDL 或登入事件是不是变成施行触发器操作。

<method_specifier>:

<method_specifier>:

对此 CLMurano触发器,钦命要与触发器绑定的先后集的形式。该方法不得不援用任何参数并回到 void。class_name 必须是实用的 SQL Server 标志符,並且必须作为持有程序集可知性的先后聚集的类存在。

对此 CLRubicon触发器,钦定要与触发器绑定的程序集的方式。该格局不得不引用任何参数并赶回 void。class_name 必须是立见成效的 SQL Server 标志符,并且必须作为具有程序集可知性的程序聚焦的类存在。

 

 

以下是DML触发器的采纳,先看看示例数据:

以下是DML触发器的选拔,先看看示例数据:

澳门新萄京官方网站 5

澳门新萄京官方网站 6

 

 

insert 触发器:

insert 触发器:

 1 if(OBJECT_ID('trigger_Stu_Insert') is not null)        -- 判断名为 trigger_Stu_Insert 的触发器是否存在
 2 drop trigger trigger_Stu_Insert        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_Insert
 5 on Student        -- 指定创建触发器的表
 6 for insert        -- insert 触发器,也可以写为 after insert
 7 as
 8 
 9 declare @C_Id    int
10 declare @S_Id    int
11 
12 select @C_Id=C_Id from Course where C_Name='SQL'    -- 获取课程为 SQL 的ID
13 select @S_Id=S_Id from inserted        --插入一条学生的数据,那么这条数据就存在 inserted 这个表中
14 
15 select @C_Id
16 select @S_Id
17 
18 select * from inserted
19 
20 update Student set C_S_Id=@C_Id where S_Id=@S_Id
21 go
22 
23 insert into Student(S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate)
24 values('016','大熊','男','210','2017-01-01')
25 
26 select * from Student
27 select * from Course
 1 if(OBJECT_ID('trigger_Stu_Insert') is not null)        -- 判断名为 trigger_Stu_Insert 的触发器是否存在
 2 drop trigger trigger_Stu_Insert        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_Insert
 5 on Student        -- 指定创建触发器的表
 6 for insert        -- insert 触发器,也可以写为 after insert
 7 as
 8 
 9 declare @C_Id    int
10 declare @S_Id    int
11 
12 select @C_Id=C_Id from Course where C_Name='SQL'    -- 获取课程为 SQL 的ID
13 select @S_Id=S_Id from inserted        --插入一条学生的数据,那么这条数据就存在 inserted 这个表中
14 
15 select @C_Id
16 select @S_Id
17 
18 select * from inserted
19 
20 update Student set C_S_Id=@C_Id where S_Id=@S_Id
21 go
22 
23 insert into Student(S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate)
24 values('016','大熊','男','210','2017-01-01')
25 
26 select * from Student
27 select * from Course

澳门新萄京官方网站 7

澳门新萄京官方网站 8

澳门新萄京官方网站 9

澳门新萄京官方网站 10

以那事例是:当 Student 表新扩展一条数据时,修改那条数据的教程ID。

以那一件事例是:当 Student 表新扩张一条数据时,修改那条数据的教程ID。

delete 触发器:

delete 触发器:

 1 if(OBJECT_ID('trigger_Stu_Delete') is not null)        -- 判断名为 trigger_Stu_Delete 的触发器是否存在
 2 drop trigger trigger_Stu_Delete        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_Delete
 5 on Student        -- 指定创建触发器的表
 6 for delete        -- delete 触发器,也可以写为 after delete
 7 as
 8 
 9 declare @C_S_Id    int
10 
11 select @C_S_Id=C_S_Id from deleted        --删除的学生的数据就存在 deleted 这个表中
12 
13 select @C_S_Id
14 
15 select * from deleted
16 
17 delete from Course where C_Id=@C_S_Id        -- 删除具有删除的学生的课程ID的课程
18 go
19 
20 delete from Student where C_S_Id='1'
21 
22 select * from Student
23 select * from Course
 1 if(OBJECT_ID('trigger_Stu_Delete') is not null)        -- 判断名为 trigger_Stu_Delete 的触发器是否存在
 2 drop trigger trigger_Stu_Delete        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_Delete
 5 on Student        -- 指定创建触发器的表
 6 for delete        -- delete 触发器,也可以写为 after delete
 7 as
 8 
 9 declare @C_S_Id    int
10 
11 select @C_S_Id=C_S_Id from deleted        --删除的学生的数据就存在 deleted 这个表中
12 
13 select @C_S_Id
14 
15 select * from deleted
16 
17 delete from Course where C_Id=@C_S_Id        -- 删除具有删除的学生的课程ID的课程
18 go
19 
20 delete from Student where C_S_Id='1'
21 
22 select * from Student
23 select * from Course

澳门新萄京官方网站 11

澳门新萄京官方网站 12

澳门新萄京官方网站 13

澳门新萄京官方网站 14

以那一件事例是:删除钦点课程ID的学习者时,并剔除钦点课程ID的教程。

以那件事例是:删除钦定课程ID的学习者时,并剔除钦赐课程ID的教程。

update 触发器:

update 触发器:

 1 if(OBJECT_ID('trigger_Cou_Update') is not null)        -- 判断名为 trigger_Cou_Update 的触发器是否存在
 2 drop trigger trigger_Cou_Update        -- 删除触发器
 3 go
 4 create trigger trigger_Cou_Update
 5 on Course        -- 指定创建触发器的表
 6 for update        -- update 触发器,也可以写为 after update
 7 as
 8 
 9 declare @C_Id    int
10 
11 select @C_Id=C_Id from deleted        
12 
13 select * from deleted        -- 修改前的数据就存在 deleted 这个表中
14 
15 select * from inserted        -- 修改后的数据就存在 inserted 这个表中
16 
17 update Student set C_S_Id=@C_Id where C_S_Id is null 
18 go
19 
20 update Course set C_Name='C#' where C_Id='4'
21 
22 select * from Student
23 select * from Course
 1 if(OBJECT_ID('trigger_Cou_Update') is not null)        -- 判断名为 trigger_Cou_Update 的触发器是否存在
 2 drop trigger trigger_Cou_Update        -- 删除触发器
 3 go
 4 create trigger trigger_Cou_Update
 5 on Course        -- 指定创建触发器的表
 6 for update        -- update 触发器,也可以写为 after update
 7 as
 8 
 9 declare @C_Id    int
10 
11 select @C_Id=C_Id from deleted        
12 
13 select * from deleted        -- 修改前的数据就存在 deleted 这个表中
14 
15 select * from inserted        -- 修改后的数据就存在 inserted 这个表中
16 
17 update Student set C_S_Id=@C_Id where C_S_Id is null 
18 go
19 
20 update Course set C_Name='C#' where C_Id='4'
21 
22 select * from Student
23 select * from Course

澳门新萄京官方网站 15

澳门新萄京官方网站 16

澳门新萄京官方网站 17

澳门新萄京官方网站 18

以那件事例是:修改课程名称时,把课程ID为空(null)的学习者的教程ID默以为修改的学科ID。

本条例子是:修改课程名称时,把课程ID为空(null)的学生的学科ID默以为修改的科目ID。

禁止修改学生学号触发器,触发器进行数据回滚:

不准修改学生学号触发器,触发器进行数据回滚:

 1 if(OBJECT_ID('trigger_Stu_Update') is not null)        -- 判断名为 trigger_Stu_Update 的触发器是否存在
 2 drop trigger trigger_Stu_Update        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_Update
 5 on Student        -- 指定创建触发器的表
 6 for update        -- update 触发器,也可以写为 after update
 7 as
 8 begin try
 9     if(UPDATE(S_StuNo))        -- 列级触发器:判断是否更新了学生学号(学号不允许更改)
10     begin
11         raiserror(66666,16,1)
12     end
13 end try
14 begin catch
15     select * from deleted        -- 修改前的数据就存在 deleted 这个表中
16     select * from inserted        -- 修改后的数据就存在 inserted 这个表中
17     rollback tran;
18 end catch
19 go
20 
21 update  Student set S_StuNo='006' where S_Id='20'
22 
23 select * from Student
 1 if(OBJECT_ID('trigger_Stu_Update') is not null)        -- 判断名为 trigger_Stu_Update 的触发器是否存在
 2 drop trigger trigger_Stu_Update        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_Update
 5 on Student        -- 指定创建触发器的表
 6 for update        -- update 触发器,也可以写为 after update
 7 as
 8 begin try
 9     if(UPDATE(S_StuNo))        -- 列级触发器:判断是否更新了学生学号(学号不允许更改)
10     begin
11         raiserror(66666,16,1)
12     end
13 end try
14 begin catch
15     select * from deleted        -- 修改前的数据就存在 deleted 这个表中
16     select * from inserted        -- 修改后的数据就存在 inserted 这个表中
17     rollback tran;
18 end catch
19 go
20 
21 update  Student set S_StuNo='006' where S_Id='20'
22 
23 select * from Student

澳门新萄京官方网站 19

澳门新萄京官方网站 20

after 触发器能够钦点八个操作都能够触发该触发器。只要求在 for/after 前边加多逗号和触发器的体系,举个例子:

after 触发器能够钦赐四个操作都足以触发该触发器。只要求在 for/after 后边增添逗号和触发器的花色,比如:

1 for update,insert,delete 
2 
3 after update,insert,delete 
1 for update,insert,delete 
2 
3 after update,insert,delete 

instead of 触发器:

instead of 触发器:

那个触发器就有意思了,上边先看看数据。

本条触发器就有趣了,上面先看看数据。

澳门新萄京官方网站 21

澳门新萄京官方网站 22

 1 if(OBJECT_ID('trigger_Stu_InsteadOf') is not null)        -- 判断名为 trigger_Stu_InsteadOf 的触发器是否存在
 2 drop trigger trigger_Stu_InsteadOf        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_InsteadOf
 5 on Student        -- 指定创建触发器的表
 6 instead of update,insert,delete         -- instead of 触发器
 7 as
 8     select * from deleted        -- 修改前的数据就存在 deleted 这个表中
 9     select * from inserted        -- 修改后的数据就存在 inserted 这个表中
10 go
11 
12 update Student set S_StuNo='006' where S_Id='20'
13 
14 insert into Student([S_StuNo],[S_Name],[S_Sex],[S_Height],[S_BirthDate])
15 values('017','清红','女','180','2017-01-01')
16 
17 delete from Student where C_S_Id='5'
18 
19 select * from Student
 1 if(OBJECT_ID('trigger_Stu_InsteadOf') is not null)        -- 判断名为 trigger_Stu_InsteadOf 的触发器是否存在
 2 drop trigger trigger_Stu_InsteadOf        -- 删除触发器
 3 go
 4 create trigger trigger_Stu_InsteadOf
 5 on Student        -- 指定创建触发器的表
 6 instead of update,insert,delete         -- instead of 触发器
 7 as
 8     select * from deleted        -- 修改前的数据就存在 deleted 这个表中
 9     select * from inserted        -- 修改后的数据就存在 inserted 这个表中
10 go
11 
12 update Student set S_StuNo='006' where S_Id='20'
13 
14 insert into Student([S_StuNo],[S_Name],[S_Sex],[S_Height],[S_BirthDate])
15 values('017','清红','女','180','2017-01-01')
16 
17 delete from Student where C_S_Id='5'
18 
19 select * from Student

澳门新萄京官方网站 23

澳门新萄京官方网站 24

实行上边的口舌之后,咦,数据怎么一点生斯图加特未有?看看上面包车型客车牵线。instead of 触发器是在此之前接触。

实践上边的语句之后,咦,数据怎么一点变通都未曾?看看上边的牵线。instead of 触发器是前边接触。

instead of 触发器并不实行其定义的操作(insert、update、delete)而仅是实践触发器本人,并且会覆盖触发语句的操作,即 after 触发器 T-SQL 语句的操作,很刚烈我们地点定义的表 Student 的 after 触发器也远非效果了,以往知道了那句话了吧。

instead of 触发器并不实行其定义的操作(insert、update、delete)而仅是试行触发器本身,并且会覆盖触发语句的操作,即 after 触发器 T-SQL 语句的操作,很鲜明大家地方定义的表 Student 的 after 触发器也从没效用了,今后精通了那句话了呢。

澳门新萄京官方网站,修改触发器:

修改触发器:

 1 alter trigger trigger_Stu_InsteadOf        -- 修改触发器
 2 on Student        -- 指定创建触发器的表
 3 instead of update,insert,delete         -- instead of 触发器
 4 as
 5     declare @Count1 int
 6     declare @Count2 int
 7 
 8     select @Count1=COUNT(1) from deleted        
 9     select @Count2=COUNT(1) from inserted        
10 
11     if(@Count1>0 and @Count2>0)
12     begin
13         select 'update操作'
14     end
15     else if(@Count1>0)
16     begin
17         select 'delete操作'
18     end
19     else if(@Count2>0)
20     begin
21         select 'insert操作'
22     end
23 go
24 
25 update Student set S_StuNo='006' where S_Id='20'
26 
27 insert into Student([S_StuNo],[S_Name],[S_Sex],[S_Height],[S_BirthDate])
28 values('017','清红','女','180','2017-01-01')
29 
30 delete from Student where C_S_Id='5'
31 
32 select * from Student
 1 alter trigger trigger_Stu_InsteadOf        -- 修改触发器
 2 on Student        -- 指定创建触发器的表
 3 instead of update,insert,delete         -- instead of 触发器
 4 as
 5     declare @Count1 int
 6     declare @Count2 int
 7 
 8     select @Count1=COUNT(1) from deleted        
 9     select @Count2=COUNT(1) from inserted        
10 
11     if(@Count1>0 and @Count2>0)
12     begin
13         select 'update操作'
14     end
15     else if(@Count1>0)
16     begin
17         select 'delete操作'
18     end
19     else if(@Count2>0)
20     begin
21         select 'insert操作'
22     end
23 go
24 
25 update Student set S_StuNo='006' where S_Id='20'
26 
27 insert into Student([S_StuNo],[S_Name],[S_Sex],[S_Height],[S_BirthDate])
28 values('017','清红','女','180','2017-01-01')
29 
30 delete from Student where C_S_Id='5'
31 
32 select * from Student

澳门新萄京官方网站 25

澳门新萄京官方网站 26

启用/禁止使用触发器:

启用/禁用触发器:

1 --禁用触发器
2 disable trigger trigger_Stu_InsteadOf on Student;    -- trigger_Stu_InsteadOf 触发器名称
3 --启用触发器
4 enable trigger trigger_Stu_InsteadOf on Student;    -- trigger_Stu_InsteadOf 触发器名称
1 --禁用触发器
2 disable trigger trigger_Stu_InsteadOf on Student;    -- trigger_Stu_InsteadOf 触发器名称
3 --启用触发器
4 enable trigger trigger_Stu_InsteadOf on Student;    -- trigger_Stu_InsteadOf 触发器名称

询问已存在的触发器:

询问已存在的触发器:

1 -- 查询已存在的触发器
2 select * from sys.triggers;
3 select * from sys.objects where type = 'TR';
4 select * from sysobjects where xtype='TR'

 1 -- sys.trigger_events 触发器事件对象视图
 2 select * from sys.trigger_events 
 3 
 4 -- 查看触发器触发事件对象    
 5 select a.type_desc,b.* from sys.trigger_events a 
 6 inner join sys.triggers b on a.object_id = b.object_id
 7 where b.name = 'trigger_Stu_Insert';
 8 
 9 -- 查询创建触发器的 T-SQL 文本
10 exec sp_helptext 'trigger_Stu_Insert'
1 -- 查询已存在的触发器
2 select * from sys.triggers;
3 select * from sys.objects where type = 'TR';
4 select * from sysobjects where xtype='TR'

 1 -- sys.trigger_events 触发器事件对象视图
 2 select * from sys.trigger_events 
 3 
 4 -- 查看触发器触发事件对象    
 5 select a.type_desc,b.* from sys.trigger_events a 
 6 inner join sys.triggers b on a.object_id = b.object_id
 7 where b.name = 'trigger_Stu_Insert';
 8 
 9 -- 查询创建触发器的 T-SQL 文本
10 exec sp_helptext 'trigger_Stu_Insert'

 

 

参考:

参考:

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:怎么配置指定的表,禁止删除数据表中指定行数

关键词: