From e1411ebf234ceabf62cd0d4f0a3aa1a2216f345d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B4=8B?= <2667310859@qq.com> Date: Thu, 29 Sep 2022 00:09:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?34=E9=99=88=E6=B4=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0925\345\207\275\346\225\260.md" | 50 +++++++++ ...27\350\247\246\345\217\221\345\231\250.md" | 72 ++++++++++++ ...30\345\202\250\350\277\207\347\250\213.md" | 105 ++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100644 "34\351\231\210\346\264\213/\344\275\234\344\270\232/0925\345\207\275\346\225\260.md" create mode 100644 "34\351\231\210\346\264\213/\344\275\234\344\270\232/0927\350\247\246\345\217\221\345\231\250.md" create mode 100644 "34\351\231\210\346\264\213/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" diff --git "a/34\351\231\210\346\264\213/\344\275\234\344\270\232/0925\345\207\275\346\225\260.md" "b/34\351\231\210\346\264\213/\344\275\234\344\270\232/0925\345\207\275\346\225\260.md" new file mode 100644 index 0000000..a92c71c --- /dev/null +++ "b/34\351\231\210\346\264\213/\344\275\234\344\270\232/0925\345\207\275\346\225\260.md" @@ -0,0 +1,50 @@ +1 编写一个函数求该银行的金额总和 + +```sql +go +create function moneysum() +returns table +as + return select sum(CardMoney) 金额总和 from BankCard +go + +select * from moneysum() +``` + +2 传入账户编号,返回账户真实姓名 + +```sql +go +create function zname(@id int) +returns varchar(20) +as +begin + declare @name varchar(20) + select @name=RealName from AccountInfo where AccountId=@id +return @name +end +go +select dbo.zname(2) +``` + +3 传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 + +```sql +go +create function cards(@begindate varchar(20),@enddate varchar(20)) +returns table +as + +return select RealName,b.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from CardExchange c +join BankCard b on c.CardNo=b.CardNo +join AccountInfo a on b.AccountId=a.AccountId +where ExchangeTime > '2022-09-01 00:00:00' and ExchangeTime < '2022-09-30 23:59:59' +go + +select * from cards('2022-09-01','2022-09-30') + +drop function cards +``` + + + diff --git "a/34\351\231\210\346\264\213/\344\275\234\344\270\232/0927\350\247\246\345\217\221\345\231\250.md" "b/34\351\231\210\346\264\213/\344\275\234\344\270\232/0927\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..35b36c9 --- /dev/null +++ "b/34\351\231\210\346\264\213/\344\275\234\344\270\232/0927\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,72 @@ +1 假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 + +```sql +go +create trigger tr_departmentname +on People for insert +as +declare @id varchar(20) +select @id=(select DepartmentId from inserted) +if exists(select * from Department where DepartmentId=@id) + begin + print '部门已经存在' + end + else + begin + insert Department values(@id,'新部门') + end +go +insert People values('007','赵云','男',10000) + +drop trigger tr_departmentname +go +``` + +2 触发器实现,删除一个部门的时候将部门下所有员工全部删除。 + +```sql +create trigger tr_deletename +on Department for delete +as +delete People where DepartmentId=(select DepartmentId from deleted) +go +delete Department where DepartmentName='市场部' +``` + +3 创建一个触发器,删除一个部门的时候 判断该部门下是否有员工,有则不删除,没有则删除。 + +```sql + +go +create trigger tr_deletenss +on department instead of delete +as +if exists(select * from People where DepartmentId=(select DepartmentId from deleted)) + print '有员工,不删除' +else + delete Department where DepartmentId=(select DepartmentId from deleted) +go + +delete Department where DepartmentId='004' +``` + +4 修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 先删除,后插入 + +```sql +go +create trigger tr_updateid +on Department after update +as +declare @id varchar(20) +declare @ids varchar(20) +select @ids=DepartmentId from deleted --删除之后 +select @id=Departmentid from inserted --更新 +update People set DepartmentId=@id where DepartmentId=@ids + +go + + +update Department set DepartmentId='005'where DepartmentName='总经办' + +drop trigger tr_updateid +``` \ No newline at end of file diff --git "a/34\351\231\210\346\264\213/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/34\351\231\210\346\264\213/\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..90274b7 --- /dev/null +++ "b/34\351\231\210\346\264\213/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,105 @@ + + +1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 + +```sql +go +create proc proc_min +as +select top 1 cardno,RealName,CardMoney from AccountInfo a join BankCard b on a.AccountId=b.AccountId order by CardMoney +go + +exec proc_min +``` + +2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 + +```sql +go +create proc proc_inbank +@no varchar(20),@money money +as +update BankCard set CardMoney=CardMoney+@money where CardNo=@no +insert CardExchange values(@no,@money,0,GETDATE()) +go + +exec proc_inbank '6225125478544587',500 +``` + +3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 + +```sql +go +create proc proc_outbank +@no varchar(20),@money money +as +declare @moneys money +select @moneys=CardMoney from BankCard where CardNo=@no +if(@money> @moneys) +begin +return -1 +end +else +begin +update BankCard set CardMoney=CardMoney-@money where CardNo=@no +insert CardExchange values(@no,0,@money,GETDATE()) +return 1 +end +go + +declare @i int +exec @i= proc_outbank '6225125478544587',500 +print @i +``` + +4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额, --传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 + +```sql +go +create proc proc_moneyinbank +@bgindate date,@enddate date,@inbank money output,@outbank money output +as +select * from CardExchange where ExchangeTime between @bgindate and @enddate +select @inbank=sum(MoneyInBank),@outbank=sum(MoneyOutBank) from CardExchange where ExchangeTime between @bgindate and @enddate +go + +declare @inbank money ,@outbank money ,@x varchar(20) +exec proc_moneyinbank '2022-09-01','2022-09-30',@inbank output,@outbank output +print '存款金额'+cast(@inbank as varchar(20))+'取款金额'+cast(@outbank as varchar(20)) + +``` + +5 + +```sql +--5. **密码升级**,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级成8位密码 +go +create proc proc_pass +@no varchar(20),@pass varchar(20) +as +declare @i varchar(20) +select @i=a.AccountId from AccountInfo a join BankCard b on a.AccountId=b.AccountId where AccountCode=@no and CardPwd=@pass +if @i=null + begin + raiserror('账号或密码错误',16,1) + end +else + begin + if len(@pass)<8 + begin + declare @xx varchar(20) + select @xx=floor(rand()*10) + while len(@pass)<8 + begin + set @pass=@pass+@xx + end + update BankCard set CardPwd=@pass where AccountId=@i + end + end + +go + + +exec proc_pass '420107198905064135','123456' +``` + -- Gitee From 5c6e273f756d66599bfdaf8d71d8451ec9b2e85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B4=8B?= <2667310859@qq.com> Date: Thu, 29 Sep 2022 00:11:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?34=E9=99=88=E6=B4=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\345\202\250\350\277\207\347\250\213.md" | 0 ...57\350\247\246\345\217\221\345\231\250.md" | 62 +++++++++++++++++++ 2 files changed, 62 insertions(+) rename "34\351\231\210\346\264\213/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" => "34\351\231\210\346\264\213/\344\275\234\344\270\232/0926\345\255\230\345\202\250\350\277\207\347\250\213.md" (100%) create mode 100644 "34\351\231\210\346\264\213/\347\254\224\350\256\260/0928\344\271\237\346\230\257\350\247\246\345\217\221\345\231\250.md" diff --git "a/34\351\231\210\346\264\213/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/34\351\231\210\346\264\213/\344\275\234\344\270\232/0926\345\255\230\345\202\250\350\277\207\347\250\213.md" similarity index 100% rename from "34\351\231\210\346\264\213/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" rename to "34\351\231\210\346\264\213/\344\275\234\344\270\232/0926\345\255\230\345\202\250\350\277\207\347\250\213.md" diff --git "a/34\351\231\210\346\264\213/\347\254\224\350\256\260/0928\344\271\237\346\230\257\350\247\246\345\217\221\345\231\250.md" "b/34\351\231\210\346\264\213/\347\254\224\350\256\260/0928\344\271\237\346\230\257\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..19f555b --- /dev/null +++ "b/34\351\231\210\346\264\213/\347\254\224\350\256\260/0928\344\271\237\346\230\257\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,62 @@ +**一 什么是触发器** + +在SQL中,触发器(trigger)是一种**特殊类型**的存储过程,它不同于SQL的存储过程。触发器主要是**通过事件进行触发**而被执行的,而**存储过程可以通过存储过程名字**而被直接调用。当对某一表进行诸如**UPDATE、 INSERT、 DELETE** 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。 + +触发器的**主要作用**就是其能够实现由**主键和外键所不能保证的复杂**的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能: + +**二 有哪些作用** + +**(1)强化约束(Enforce restriction)** + +触发器能够实现比CHECK 语句更为复杂的约束。 + +**(2)跟踪变化(Auditing changes)** + +触发器可以侦测 [数据库](http://lib.csdn.net/base/14) 内的操作,从而不允许数据库中未经许可的指定更新和变化。 + +**(3)级联运行(Cascaded operation)** + +触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。 + +**(4)存储过程的调用(Stored procedure invocation)。** + +为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。 +由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。 + + + +三 触发器有哪几种种类 + +分为 DML触发器和DDL触发器 + +#### DML触发器 : 增删改 + +##### after触发器: + +after触发器主要用于:insert,update,delete + +##### instead of 触发器 + +**四 怎么创建触发器** + + 创建步骤 + +```sql +CREATE TRIGGER <触发器名称> + +ON table_name + +[WITH ENCRYPTION] + +FOR [DELETE, INSERT, UPDATE] + +AS + + T-SQL语句 + +GO +--WITH ENCRYPTION表示加密触发器定义的SQL文本 + +--DELETE, INSERT, UPDATE指定触发器的类型 +``` + -- Gitee