0%

数据库大作业笔记(十一)

存储过程和事务

今天用一个小时帮别人写好了大作业里的存储过程(也称函数)和事务,记录一下遇到的问题:

  1. 若出现表名或属性名与关键字重复的情况(最好不要出现这种情况),应该在表名或属性名上加`…`,注意此处不是单引号,例如:`view`。
  2. 开启事务是start transaction,不是begin。
  3. 在存储过程声明参数或变量时,要先写变量名再写变量类型,例如:(IN id INT)或”DECLARE id INT;”。
  4. 如果在存储过程中有抛出错误的语句(DECLARE HANDLER CONTINUE FOR SQLEXCEPTION SET id=1;),那么赋值语句要写在它之后,放在它前面的话会报错。

关于触发器

做了当一个表删除时的触发器,怎么获取被删除的那条数据的信息呢,比如说ID?
1
2
declare @ID typeof ID;
select @ID=ID from deleted;

触发器中有两个特殊的表:inserted和deleted,可以从中获取被插入或删除行的信息。

还看见了一个奇怪的问题

在Sql Server触发器中判断操作是Insert还是Update还是Delete?

解答中用到了这两个表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DECLARE
@IsInsert bit,
@IsUpdate bit,
@IsDelete bit
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
SET @IsInsert = 1
ELSE
SET @IsInsert = 0
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsUpdate = 1
ELSE
SET @IsUpdate = 0
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsDelete = 1
ELSE
SET @IsDelete = 0
create trigger Update_Del on Table1
for update,delete -- 为什么事件触发
as -- 事件触发后所要做的事情
if not exists(select 1 from inserted)
begin /*inserted表无记录,是删除*/
end
else
begin /*是更新*/ end
go

Deleted表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted表中。Deleted 表和触发器表通常没有相同的行。
Inserted表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)