diff --git "a/25\346\235\250\344\270\260\345\215\216/\344\275\234\344\270\232/9.27 \347\254\254\345\215\201\345\233\233\350\212\202 \350\247\246\345\217\221\345\231\250/9.27 \350\247\246\345\217\221\345\231\250.md" "b/25\346\235\250\344\270\260\345\215\216/\344\275\234\344\270\232/9.27 \347\254\254\345\215\201\345\233\233\350\212\202 \350\247\246\345\217\221\345\231\250/9.27 \350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..08fff420b859952fd00ff7765765bb207371a37c --- /dev/null +++ "b/25\346\235\250\344\270\260\345\215\216/\344\275\234\344\270\232/9.27 \347\254\254\345\215\201\345\233\233\350\212\202 \350\247\246\345\217\221\345\231\250/9.27 \350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,63 @@ +``` + +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 +go +create trigger tri_d1 +on people after insert +as + + if (select DepartmentId from inserted ) not in(select DepartmentId from Department) + begin + declare @Id varchar(20) + set @Id=(select DepartmentId from inserted) + insert Department values(@Id,'新部门') + end + +go + +insert People values ('009','赵云','男','10000') + +--(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除。 +go +create trigger tri_de +on department after delete +as + delete from People where DepartmentId=(select DepartmentId from deleted) +go + +delete from Department where DepartmentName='市场部' + + +--(3)创建一个触发器,删除一个部门的时候判断该部门下是否有员工,有则不删除,没有则删除。 +go +create trigger tri_d3 +on department after delete +as +if exists(select DepartmentId from People where DepartmentId in (select DepartmentId from deleted) ) + begin + rollback transaction + end + +go + +delete from Department where DepartmentName='人事部' +--(4)修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 +go +create trigger tri_d4 +on department after update +as + declare @Id varchar(10)= (select DepartmentId from inserted) + declare @Id2 varchar(10)=(select DepartmentId from deleted) + + if update(DepartmentId) + begin + update People set DepartmentId=@Id from inserted + where People.DepartmentId=@Id2 + end + +go + + +update Department set DepartmentId='008' where DepartmentId='001' +``` + diff --git "a/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.27 \347\254\254\345\215\201\345\233\233\350\212\202 \350\247\246\345\217\221\345\231\250.md" "b/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.27 \347\254\254\345\215\201\345\233\233\350\212\202 \350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..f2773c9fcf1b0fa1349033c59d60ef41353dbe53 --- /dev/null +++ "b/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.27 \347\254\254\345\215\201\345\233\233\350\212\202 \350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,67 @@ +### 一、触发器 + +#### 1、概念 + +触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 + +#### 2、触发器类型 + +##### 2.1、DML触发器 + +主要有三种:(inserte,deleted,update) + +inserte:向表中插入数据时触发 + +``` +go +create trigger (触发器名,一般以tri_开头) +on 表名 alter inserte +as + +go + +插入语句(符合条件会触发上面触发器) +``` + +deleted:从表中删除数据时被触发 + +``` +go +create trigger (触发器名,一般以tri_开头) +on 表名 alter deleted +as + +go + +删除语句(符合条件会触发上面触发器) +``` + +update:更新数据时会触发 + +``` +create trigger (触发器名,一般以tri_开头) +on 表名 after update +as + declare @值1 数据类型=(select 所需修改的数据列 from inserted) + declare @值2 数据类型=(select 所需修改的数据列 from deleted) + + begin + update 表名 set 修改的列名=@值 from inserted + where 表名.修改的列名 = @值2 + end + +go + + +update 表名 set 修改的列名='修改后的值' where 修改的列名='修改前的值' +``` + + + +##### 2.2、DDL触发器 + + DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。 + +##### 2.3、登录触发器。 + +登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。