From dbc91860e18c433a5c4476b23c25dca968dae81d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=99=A8=E5=93=B2?= <2405244077@qq.com> Date: Sun, 9 Oct 2022 11:14:53 +0800 Subject: [PATCH] 1 --- ...30\345\202\250\350\277\207\347\250\213.md" | 44 ++++++++ ...27\350\247\246\345\217\221\345\231\250.md" | 45 ++++++++ ...30\345\202\250\350\277\207\347\250\213.md" | 103 ++++++++++++++++++ ...27\350\247\246\345\217\221\345\231\250.md" | 47 ++++++++ 4 files changed, 239 insertions(+) create mode 100644 "18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.27\350\247\246\345\217\221\345\231\250.md" create mode 100644 "18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" diff --git "a/18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000..8457492 --- /dev/null +++ "b/18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,44 @@ +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 + +go +create proc proc_one + +as +select top 1 CardNo ,RealName,CardMoney from AccountInfo a inner join BankCard b on a.AccountId=b.AccountId +order by CardMoney + +go +exec proc_one + +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 + +go +create proc proc_two +@moneys money, +@Id varchar(20) +as + update BankCard set CardMoney=CardMoney+@moneys where CardNo=@Id + insert CardExchange values(@Id,@moneys,0,GETDATE()) +go +exec proc_two'10000','6225125478544587' + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 + +go +create proc proc_three +@moneys money, +@Id varchar(20) +as + declare @mone money= + (select CardMoney from BankCard where CardNo=@Id) + if (@mone-@moneys>0) + begin + update BankCard set CardMoney=CardMoney-@moneys where CardNo=@Id + insert CardExchange values(@Id,0,@moneys,GETDATE()) + print 1 + end + else + print -1 +go + +exec proc_three'10000','6225547854125656' \ No newline at end of file diff --git "a/18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.27\350\247\246\345\217\221\345\231\250.md" "b/18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.27\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..46ccecc --- /dev/null +++ "b/18\346\235\250\346\231\250\345\223\262/\344\275\234\344\270\232/9.27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,45 @@ +select * from Department +select * from People + + +--(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='人事部' \ No newline at end of file diff --git "a/18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/18\346\235\250\346\231\250\345\223\262/\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 0000000..2eafa65 --- /dev/null +++ "b/18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,103 @@ +存储过程 +什么是存储过程 +存储过程是预编译SQL语句集合,这些语句存储在一个名称(存储过程的名称)下并作为单元来处理。存储过程代替了传统的逐条执行SQL语句的方式,一个存储过程中可以包含查询、插入、删除、更新等操纵的一系列SQL语句,当这个存储过程被调用执行时,这些操作也会同时执行。 + +封装好 --> 调用 + +存储过程的分类 +系统存储过程 +系统存储过程是用来管理SQL Server与显示有关数据库和用户的信息的存储过程。 + +常见的系统存储过程有 + +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 显示默认值,未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。 +自定义存储过程 +创建存储过程 + +1.没有输入参数,没有输出参数的存储过程。 + +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 +执行存储过程 + +--无参 +exec <存储过程名称> +--带参 +exec <存储过程名称> <形参1>,<形参2>,... +--带参带返回值 +declare @变量 +exec @变量 = <存储过程名称> <形参1>,<形参2>,... +--有输入参数,有输出参数的存储过程 +declare @变量 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +--一个变量同时具备输入输出功能 +declare @变量 <数据类型> = 值 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +删除存储过程 + +drop procedure <存储过程名称> +存储过程的优点 +允许模块化程序设计 + +执行速度更快 + +减少网络流通量 + +提高系统安全性 + +存储过程与函数的区别 +1.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + +2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + +3.储存过程可以输入输出参数,而函数只可以输入参数。 + +4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 + +5.可以在存储过程中调用函数,不可以在函数中调用存储过程。 + +6.函数可以作为条件在语句中使用,但是存储过程不可以。 \ No newline at end of file diff --git "a/18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" "b/18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..b974723 --- /dev/null +++ "b/18\346\235\250\346\231\250\345\223\262/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,47 @@ +触发器(trigger) +触发器( trigger )是作为对数据库修改的连带效果而由系统自动执行的一条语句。它是一种特殊的存储过程。也是一个事务(可以回滚)。为了定义一个触发器,我们必须: + +指明什么时候执行触发器。这被拆分为引起触发器被检测的一个*事件*和触发器继续执行所必须满足的一个条件。 +指明当触发器执行时所采取的动作。 +触发器分类 +after触发器: +after触发器主要用于:insert,update,delete + +instead of 触发器 +使用INSTEAD OF触发器的典型示例是覆盖视图上的插入,更新或删除操作。 + +instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 + +、INSTEAD OF触发器是一种触发器,用于跳过对表或视图的[INSERT],[DELETE]或[UPDATE]语句,并执行触发器中定义的其他语句。根本不会发生实际的插入,删除或更新操作。 + +换句话说,INSTEAD OF触发器会跳过DML语句并执行其他语句。 + +CREATE TRIGGER [schema_name.] trigger_name +ON INSTEAD OF {[INSERT] [,] [UPDATE] [,] [DELETE] } +AS +begin +--sql语句 +end + +创建触发器的语句 + create TRIGGER <触发器名称> + +ON table_name + +[WITH ENCRYPTION] + +FOR [DELETE, INSERT, UPDATE] + +AS + + SQL语句 + +GO +删除触发器 +drop trigger trigger_name +instead of 触发器 +1.插入操作(Insert) ****inserted 表*有数据,*deleted 表****无数据 + +2.删除操作(Delete) ****inserted 表*无数据,*deleted 表****有数据 + +3.更新操作(Update) ****inserted 表*有数据(新数据),*deleted 表****有数据(旧数据) \ No newline at end of file -- Gitee