diff --git "a/10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.26-\350\247\246\345\217\221\345\231\250.md" "b/10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.26-\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..238b20475523c124d098cf1fdc3818910eedd2b3 --- /dev/null +++ "b/10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.26-\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,50 @@ +```sql +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 +go +create trigger DepartInfo +on People after insert +as + if not exists(select * from inserted where DepartmentId in (select DepartmentId from Department)) + begin + insert into Department values((select DepartmentId from inserted),'新部门') + end +go +insert into People values('006','hcf','男',8000) +select * from Department +select * from People +--(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除。 +go +create trigger DeleteName +on Department after delete +as + delete from People where DepartmentId = (select DepartmentId from deleted) +go +delete from Department where DepartmentName = '总经办' +select * from Department +select * from People +--(3)创建一个触发器,删除一个部门的时候判断该部门下是否有员工,有则不删除,没有则删除。 +go +create trigger DepartPeople +on Department instead of delete +as + if not exists(select * from People where DepartmentId in (select DepartmentId from deleted)) + begin + delete from People where DepartmentId =(select DepartmentId from deleted) + end +go +delete from Department where DepartmentId=1 +select * from Department +select * from People +--(4)修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 +go +create trigger AlterId +on Department after update +as + update People set DepartmentId=(select DepartmentId from inserted) + where DepartmentId =(select DepartmentId from deleted) +go +update Department set DepartmentId = '001' where DepartmentName = '总经办' +select * from Department +select * from People +``` + diff --git "a/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.22-\346\255\273\351\224\201.md" "b/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.22-\346\255\273\351\224\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..4cf7409a14d95ffc11af9696c2da64c5d5e558a5 --- /dev/null +++ "b/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.22-\346\255\273\351\224\201.md" @@ -0,0 +1,30 @@ +## 死锁 + +#### 就是两个或多个trans,同时请求对方正在请求的某个实际应用对象,而导致双方互相等待。 + +### 表现 + +```sql +--表现1. +一个用户A 访问表A(锁住了表A),然后又访问表B。 +另一个用户B 访问表B(锁住了表B),然后企图访问表A, +这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续,这就造成死锁了。 +--解决方法: +这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法 +仔细分析你程序的逻辑, +1:尽量避免同时锁定两个资源 +2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源. +``` + +```sql +--表现2. +用户A读一条纪录,然后修改该条纪录。 +这时用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释 +放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。 +这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。 +--解决方法 +让用户A的事务(即先读后写类型的操作),在select 时用Update lock +语法如下: +select * from table1 with(updlock) where .... +``` + diff --git "a/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.27-\350\247\246\345\217\221\345\231\250.md" "b/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.27-\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..79fef93cc333adede18aa49e196046e4b42eb166 --- /dev/null +++ "b/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.27-\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,27 @@ +## 触发器 + + **触发器**( trigger )是作为**对数据库修改的连带效果**而**由系统自动执行**的一条语句。它是一种特殊的**存储过程**。也是一个**事务**(可以回滚)。为了定义一个[触发器](https://so.csdn.net/so/search?q=触发器&spm=1001.2101.3001.7020),我们必须: + +- 指明**什么时候执行触发器**。这被拆分为**引起触发器被检测的一个\*事件\***和**触发器继续执行所必须满足的一个条件**。 +- 指明**当触发器执行时所采取的动作**。 + +#### 触发器分类 + +分为 DML触发器和DDL触发器 + +#### DML触发器 : 增删改 + +#### after触发器: insert,update,delete + +### instead of 触发器 + +#### 触发器的创建 + +```sql +go +create trigger 触发名 +on 表名 (after:执行后) (inserted,deleted,updated) +as +go +``` +