From 52dc52a4e0d6751201d0badd1d1391cb4bbe9248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=B3=B3=E6=B3=B0?= <2843538489@qq.com> Date: Wed, 28 Sep 2022 13:25:55 +0800 Subject: [PATCH] xx --- .../\344\275\234\344\270\232/2022.09.27.md" | 70 +++++++++++++++++++ .../2022.9.21--\345\207\275\346\225\260.md" | 43 ++++++++++++ .../2022.9.22--\346\255\273\351\224\201.md" | 14 ++++ ...50\345\255\230\350\277\207\347\250\213.md" | 25 +++++++ ...--\350\247\246\345\217\221\345\231\250.md" | 39 +++++++++++ 5 files changed, 191 insertions(+) create mode 100644 "20\345\220\264\346\263\263\346\263\260/\344\275\234\344\270\232/2022.09.27.md" create mode 100644 "20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.21--\345\207\275\346\225\260.md" create mode 100644 "20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" create mode 100644 "20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.26--\345\202\250\345\255\230\350\277\207\347\250\213.md" create mode 100644 "20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" diff --git "a/20\345\220\264\346\263\263\346\263\260/\344\275\234\344\270\232/2022.09.27.md" "b/20\345\220\264\346\263\263\346\263\260/\344\275\234\344\270\232/2022.09.27.md" new file mode 100644 index 0000000..674261f --- /dev/null +++ "b/20\345\220\264\346\263\263\346\263\260/\344\275\234\344\270\232/2022.09.27.md" @@ -0,0 +1,70 @@ +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/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.21--\345\207\275\346\225\260.md" "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.21--\345\207\275\346\225\260.md" new file mode 100644 index 0000000..4fcb7c7 --- /dev/null +++ "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.21--\345\207\275\346\225\260.md" @@ -0,0 +1,43 @@ +函数 +函数分为 +(1)系统函数: +从数据库返回在SQLSERVER中的值、对象或设置的特殊信息(用于返回元数据或配置设置); + +(2)自定义函数(方法:将一个功能封装成可重用的函数)。 +(1)标量值函数(标量函数是基于输入的值,输出一个单一的值。) +CREATE FUNCTION function_name(@parameter_name parameter_data_type) RETURNS date_type + +[WITH ENCRYPTION] + +[AS] + +BEGIN + +function_body + +RETURN 表达式; + +END + +(2)表值函数(返回查询结果) +表值函数提供强大的结果集生成能力。它可以在查询内部表或视图允许的任何地方使用。表值函数在使用上比返回一个结果集的存储过程更灵活,因为函数的结果集可以联接到查询中的其他表。 + +语法: + +create function 名称 + +([{@参数名称 参数类型[=默认值]}[,n]]) + +returns @局部变量 table(参数名 参数类型) + +[with encryption] + +[as] + +begin + +函数体 + +return 函数返回值 + +end \ No newline at end of file diff --git "a/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" new file mode 100644 index 0000000..0ce9733 --- /dev/null +++ "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" @@ -0,0 +1,14 @@ +死锁 +原因 +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/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.26--\345\202\250\345\255\230\350\277\207\347\250\213.md" "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.26--\345\202\250\345\255\230\350\277\207\347\250\213.md" new file mode 100644 index 0000000..f32dc76 --- /dev/null +++ "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.26--\345\202\250\345\255\230\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/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..802c940 --- /dev/null +++ "b/20\345\220\264\346\263\263\346\263\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,39 @@ +#### 什么是触发器 + + **触发器**( trigger )是作为**对数据库修改的连带效果**而**由系统自动执行**的一条语句。它是一种特殊的**存储过程**。也是一个**事务**(可以回滚)。为了定义一个[触发器](https://so.csdn.net/so/search?q=触发器&spm=1001.2101.3001.7020),我们必须: + +- 指明**什么时候执行触发器**。这被拆分为**引起触发器被检测的一个\*事件\***和**触发器继续执行所必须满足的一个条件**。 +- 指明**当触发器执行时所采取的动作**。 + +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 表\****有数据(旧数据) -- Gitee