diff --git "a/29\345\220\264\346\230\212\347\273\251/\344\275\234\344\270\232/9.27.md" "b/29\345\220\264\346\230\212\347\273\251/\344\275\234\344\270\232/9.27.md" new file mode 100644 index 0000000000000000000000000000000000000000..a66a97bfa7199d74c8192c901752f5735af5f5b7 --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\344\275\234\344\270\232/9.27.md" @@ -0,0 +1,9 @@ +create database bumen go use bumen 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) + +select * from Department select *from People + +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 go create trigger tj on People after insert as begin declare @a varchar(20)=(select DepartmentId from inserted) if @a not in (select DepartmentId from Department) begin insert into Department values(@a,'新部门') end end go insert into People values('005','小杰','男',1) drop trigger tj --(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除。 go create trigger sc on Department after delete as begin declare @a varchar(20)=(select DepartmentId from deleted) delete People where DepartmentId=@a end go drop trigger sc delete Department where DepartmentId='005' --(3)创建一个触发器,删除一个部门的时候判断该部门下是否有员工,有则不删除,没有则删除。 + +--(4)修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 \ No newline at end of file diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..211f167c359a4181c609abcf8afa3897a95f71d7 --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" @@ -0,0 +1,11 @@ +死锁 原因 SQL Server数据库死锁,通俗的讲就是两个或多个trans,同时请求对方正在请求的某个实际应用对象,而导致双方互相等待。简单的例子如下: sql server死锁表现一: + +   一个用户A 访问表A(锁住了表A),然后又访问表B。    另一个用户B 访问表B(锁住了表B),然后企图访问表A,    这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续,这就造成死锁了。 + +sql server死锁解决方法:    这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法    仔细分析你程序的逻辑,    1:尽量避免同时锁定两个资源    2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源. + +sql server死锁表现二: + +   用户A读一条纪录,然后修改该条纪录。    这时用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释    放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。    这种死锁比较隐蔽,但其实在稍大点的项目中经常发生 + +sql server死锁解决方法:    让用户A的事务(即先读后写类型的操作),在select 时用Update lock 语法如下:    select * from table1 with(updlock) where .... \ No newline at end of file diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..f32dc7613d279039e5fb1178476b06875b2508da --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,25 @@ +常见的系统存储过程有 sp_databases 列出服务上的所有数据库 sp_helpdb --报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables --返回当前环境下可查询的对象的列表 sp_columns 返回某个表列的信息 sp_help --返回某个表的所有信息 sp_helpconstraint 查看某个表的约束 sp_helpindex --查看某个表的索引 sp_stored_procedures 列出当前环境中的所有存储过程 sp_password --添加或修改登录账户的密码 sp_rename 重命名存储过程 sp_helptext 显示默认值,未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。 + +自定义存储过程 create proc <存储过程名称> as go + +2.有输入参数,没有输出参数的存储过程 create proc <存储过程名称> <变量1> <数据类型> <变量2> <数据类型> ... as go + +3.有输入参数,没有输出参数,但是有返回值的存储过程(返回值必须整数)。 create proc <存储过程名称> <变量1> <数据类型> <变量2> <数据类型> ... as return 整数 go + +4.有输入参数,有输出参数的存储过程 & 一个变量具备同时输入输出参数的存储过程 create proc <存储过程名称> <变量1> <数据类型> output <变量2> <数据类型> output ... as return 整数 go + +删除存储过程 drop procedure <存储过程名称> + +存储过程与函数的区别 + +1.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + +2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + +3.储存过程可以输入输出参数,而函数只可以输入参数。 + +4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 + +5.可以在存储过程中调用函数,不可以在函数中调用存储过程。 + +6.函数可以作为条件在语句中使用,但是存储过程不可以。 \ No newline at end of file diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..99d31b7e5efd32beb831940413ab3e4e8f5df452 --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,30 @@ +什么是触发器 +触发器( trigger )是作为对数据库修改的连带效果而由系统自动执行的一条语句。它是一种特殊的存储过程。也是一个事务(可以回滚)。为了定义一个触发器,我们必须: + +指明什么时候执行触发器。这被拆分为引起触发器被检测的一个*事件*和触发器继续执行所必须满足的一个条件。 +指明当触发器执行时所采取的动作。 +DML触发器分为: + +1、after触发器(之后触发) + +a、insert触发器 b、update触发器 c、delete触发器 + +创建触发器:CREATE TRIGGER trigger_name + + ON table_name + + [WITH ENCRYPTION] + + FOR [DELETE, INSERT, UPDATE] + + AS + + T-SQL语句 + + GO +总结 +1.插入操作(Insert) ****inserted 表*有数据,*deleted 表****无数据 + +2.删除操作(Delete) ****inserted 表*无数据,*deleted 表****有数据 + +3.更新操作(Update) ****inserted 表*有数据(新数据),*deleted 表****有数据(旧数据 \ No newline at end of file diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.28union.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9.28union.md" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391