From bc1bbcf97a347f9886aea5c20bb58db4b0f5ca47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?09=E9=99=88=E7=83=BD=E6=9D=B0sql=E8=BF=9B=E9=98=B6?= <3241892760@qq.com> Date: Wed, 28 Sep 2022 12:40:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\350\247\246\345\217\221\345\231\250.md" | 103 ++++++++++++++++++ ...27\350\247\246\345\217\221\345\231\250.md" | 58 ++++++++++ 2 files changed, 161 insertions(+) create mode 100644 "09\351\231\210\347\203\275\346\235\260/\344\275\234\344\270\232/09.27\350\247\246\345\217\221\345\231\250.md" create mode 100644 "09\351\231\210\347\203\275\346\235\260/\347\254\224\350\256\260/09.27\350\247\246\345\217\221\345\231\250.md" diff --git "a/09\351\231\210\347\203\275\346\235\260/\344\275\234\344\270\232/09.27\350\247\246\345\217\221\345\231\250.md" "b/09\351\231\210\347\203\275\346\235\260/\344\275\234\344\270\232/09.27\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..508cf2f --- /dev/null +++ "b/09\351\231\210\347\203\275\346\235\260/\344\275\234\344\270\232/09.27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,103 @@ +create database liu +go +use liu +go +create table Department +( + DepartmentId varchar(10) primary key , --主键,自动增长 + DepartmentName nvarchar(50), --部门名称 +) +--人员信息 +create table People +( + PeopleId int primary key identity(1,1), --主键,自动增长 + DepartmentId varchar(10), --部门编号,外键,与部门表关联 + PeopleName nvarchar(20), --人员姓名 + PeopleSex nvarchar(2), --人员性别 + PeopleSalary money, --薪水 +) +insert into Department(DepartmentId,DepartmentName) +values('001','总经办') +insert into Department(DepartmentId,DepartmentName) +values('002','市场部') +insert into Department(DepartmentId,DepartmentName) +values('003','人事部') +insert into Department(DepartmentId,DepartmentName) +values('004','财务部') + +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('001','刘备','男',8000) +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('001','关羽','男',5000) +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('002','张飞','男',3000) + +--CREATE TRIGGER <触发器名称> + +--ON table_name + +--[WITH ENCRYPTION] + +--FOR [DELETE, INSERT, UPDATE] + +--AS + +-- T-SQL语句 + +--GO +--WITH ENCRYPTION表示加密触发器定义的SQL文本 + +--DELETE, INSERT, UPDATE指定触发器的类型 +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 +create trigger tri_r +on people after insert +as +begin + + if not exists (select *from Department where DepartmentId=(select DepartmentId from inserted)) + begin + insert Department values ((select Departmentid from inserted),'新部门') + end + end +insert People values ( '005','迷失梦','男',1528 ) +insert Department values ('005','新部门') +--(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除。 +create trigger tri_sc +on department after delete +as +begin + + delete from People where DepartmentId=(select DepartmentId from deleted) + + + end +delete from department where DepartmentName='新部门' +select *from People +select *from Department +你就 +--(3)创建一个触发器,删除一个部门的时候判断该部门下是否有员工,有则不删除,没有则删除。 +create trigger tri_scq +on department instead of delete +as +begin + if not exists (select DepartmentId from People where departmentid= (select DepartmentId from deleted) ) + begin + delete from Department where DepartmentId=(select DepartmentId from deleted) + + end + + end + +delete from department where DepartmentName='新部门' +select *from People +select *from Department +--(4)修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 +create trigger tri_xg +on department after update +as +begin + +update People set DepartmentId=(select DepartmentId from inserted) where DepartmentId=(select DepartmentId from deleted) + + end + update Department set departmentid='17' where DepartmentId=(select DepartmentId from Department where DepartmentName='新部门' ) diff --git "a/09\351\231\210\347\203\275\346\235\260/\347\254\224\350\256\260/09.27\350\247\246\345\217\221\345\231\250.md" "b/09\351\231\210\347\203\275\346\235\260/\347\254\224\350\256\260/09.27\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..5d108bb --- /dev/null +++ "b/09\351\231\210\347\203\275\346\235\260/\347\254\224\350\256\260/09.27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,58 @@ +**一 什么是触发器** + +在SQL中,触发器(trigger)是一种**特殊类型**的存储过程,它不同于SQL的存储过程。触发器主要是**通过事件进行触发**而被执行的,而**存储过程可以通过存储过程名字**而被直接调用。当对某一表进行诸如**UPDATE、 INSERT、 DELETE** 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。 + +触发器的**主要作用**就是其能够实现由**主键和外键所不能保证的复杂**的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能: + +**二 有哪些作用** + +**(1)强化约束(Enforce restriction)** + +触发器能够实现比CHECK 语句更为复杂的约束。 + +**(2)跟踪变化(Auditing changes)** + +触发器可以侦测 [数据库](https://gitee.com/link?target=http%3A%2F%2Flib.csdn.net%2Fbase%2F14) 内的操作,从而不允许数据库中未经许可的指定更新和变化。 + +**(3)级联运行(Cascaded operation)** + +触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。 + +**(4)存储过程的调用(Stored procedure invocation)。** + +为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。 由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。 + +三 触发器有哪几种种类 + +分为 DML触发器和DDL触发器 + +#### DML触发器 : 增删改 + +##### after触发器: + +after触发器主要用于:insert,update,delete + +##### instead of 触发器 + +**四 怎么创建触发器** + +创建步骤 + +``` +CREATE TRIGGER <触发器名称> + +ON table_name + +[WITH ENCRYPTION] + +FOR [DELETE, INSERT, UPDATE] + +AS + + T-SQL语句 + +GO +--WITH ENCRYPTION表示加密触发器定义的SQL文本 + +--DELETE, INSERT, UPDATE指定触发器的类型 +``` -- Gitee