SQL Server学习进程(十一)---触发器

1.触发器

触发器是特殊的存储过程。

它的主要优点:

(1)触发器是自动的。当对表中的数据做了任何修改之后立即被激活。

(2)触发器可以通过数据库中的相关表进行层叠修改。

(3)触发器可以强制修改。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。

触发器分类

1.数据操作语言(DML)触发器

DML触发器有3种:INSERT触发器,UPDATE触发器,DELETE触发器

针对每个DML触发器定义了两个特殊的表:DELETED表和INSERTED表,这两个逻辑表在内存中存放,由系统来创建和维护,用户不能对它们进行修改。触发器执行完成后与该触发器相关的这两个表也会被删除。

DELETED表存放执行DELETE或者UPDATE语句而要从表中删除的所有行。在执行DELETE或UPDATE时,被删除的行从触发触发器的表中被移动到DELETED表,这两个表值会有公共的行。

INSERTED表存放执行INSERT或UPDATE语句而向表中插入的所有行,在执行INSERT或者UPDATE事务中,新行同时添加到触发触发器的表和INSERTED表。INSERTED表的内容是触发触发器的表中新行的副本,即INSERTED 表中的行总是与作用表中的新行相同。

2.数据定义语言(DDL)触发器

DDL触发器是当服务器或者数据库中发生数据定义语言事件时被激活调用,使用DDL触发器可以防止对数据库架构进行的某些更改或记录数据库架构中的更改或事件。

2.创建DML触发器

CREATE TRIGGER trigger_name
ON {table | view}
[WITH <ENCRYPTION>]
{
{
{FOR | AFTER | INSTEAD OF}{[DELETE][,][INSERT][,][UPDATE]
AS
sql_statement [,...n]
}

}

2.1INSERT触发器

create trigger Insert_Student
on students
AFTER INSERT
AS
BEGIN
  IF OBJECT_ID(N'stu_Sum',N'U') IS NULL
  CREATE TABLE stu_Sum(number INT DEFAULT 0);
  DECLARE @stuNumber INT;
  SELECT @stuNumber=COUNT(*) FROM students;
  if not exists(select * from stu_Sum)
  insert into stu_Sum values(0);
  UPDATE stu_Sum set number=@stuNumber;

END

--禁止向表中插入数据

create trigger insertforbidden
on animals
after insert
as
begin
RAISERROR('不允许直接向该表插入记录,操作被禁止',1,1)
rollback transaction
end

insert into animals values('12','Tum',null,null,10,null,null)

2.2DELETE触发器

create trigger deleteddata
on animals
after delete
as
begin
select ID 被删除动物编号,Name,Food FROM deleted
end

delete from animals where ID='1'

2.3UPDATE触发器

update触发器可以执行两种操作:更新前的记录存储在DELETED表中;更新后的记录存储在INSERTED表。

2.4替代触发器

CREATE TRIGGER InsteadOfInsert_Student
ON students
INSTEAD OF INSERT
AS
BEGIN
DECLARE @StuScore INT;
SELECT @StuScore=(SELECT 成绩 FROM inserted)
if @StuScore>100
  SELECT '插入成绩错误' as  失败原因
END

3.创建DDL触发器

--将DDL触发器的作用域应用于当前数据库
CREATE TRIGGER xiugaiableforbidden
on DATABASE
FOR drop_table,alter_table
as
begin
print '用户没有权限执行删除操作'
rollback transaction 

end

drop table animalss
--将DDL触发器的作用域应用于整个服务器
CREATE TRIGGER DenyCreate_AllServer
ON ALL SERVER
FOR CREATE_DATABASE,ALTER_DATABASE
as
begin
print '用户没有权限创建或修改服务器上的数据库!'
rollback transaction 
end

CREATE DATABASE demo;

4.管理触发器

4.1查看触发器

目标触发器-》(右击)修改-》


sp_helptext deleteddata;

4.2修改触发器

CREATE换为ALTER,修改触发器与创建触发器只有一个关键字的区别

4.3删除触发器

DROP TRIGGER trigger_name,trigger_name1,trigger_name2...n;

4.4启用和禁用触发器

ALTER TABLE animals 

DISABLE TRIGGER deletedata

--

DISABLE TRIGGER deletedata ON animals

--禁止使用数据库作用域的触发器deletedata

DISABLE TRIGGER deletedata ON DATABASE

启用触发器

ALTER TABLE animals 

ENABLE TRIGGER deletedata

--

ENABLE TRIGGER deletedata ON animals

--启用数据库作用域的触发器deletedata

ENABLE TRIGGER deletedata ON DATABASE


猜你喜欢

转载自blog.csdn.net/qq_40951833/article/details/80769978