SQL 图书馆系统数据库触发器代码

SQL 图书馆系统数据库触发器代码,第1张

1、---------------这是分割线--------------------------

Create Trigger tg_借书触发器名 on [借阅记录] For Insert

as

update [借阅记录] set [借阅记录].借书日期=getdate(), [借阅记录].应还日期=getdate()+[读者].可借天数

from [借阅记录] inner join [读者] on [借阅记录].读者卡号=[读者].读者卡号

where [借阅记录] in(SELECT [借阅记录] FROM INSERTED)

update [图书] set [图书].在库数量=[图书].在库数量-1

where [图书].图书号 in (select 图书号 from Inserted)

update [读者] set [读者].可错数量=[读者].可错数量-1

where [读者].读者卡号 in (select 读者卡号 from Inserted)

2、--------------------这是分割线--------------------------------

create trigger tg_还书触发器名 on [借阅记录] For Update

as

update [图书] set [图书].在库数量=[图书].在库数量+1

where [图书].图书号 in (select 图书号 from Deleted)

update [读者] set [读者].可错数量=[读者].可错数量+1

where [读者].读者卡号 in (select 读者卡号 from Deleted)

--超期时插入到超期记录表

if(select 1 from Deleted where 应还日期<getdate())

begin

--insert into 超期记录表(编号,读者卡号,超期天数,超期金额) values(…………)

-----题目中没给出超期金额算法,编号应该是自动不应该手动插入。

end

3、---------这是分割线--------------------

create trigger tr_插入读者触发器名 on [读者] For Insert

as

if(select 1 from Inserted where 类型='学生')

begin

update [读者] set 可借天数=30 where 读者卡号 in(select 读者卡号 from Inserted)

end

else

begin

update [读者] set 可借天数=60 where 读者卡号 in(select 读者卡号 from Inserted)

end

注释:触发器语句中使用了两种特殊的表:deleted 表和 inserted 表。

Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

---创建测试表:

Create Table MyTest(

id int identity(1,1) not null primary key,

[name] varchar(100) null

)

--创建触发器:

CREATE TRIGGER trigtest--创建触发器trigtest

ON mytest--在表mytest上建

for INSERT,DELETE,UPDATE--为插入,删除,修改

AS

BEGIN

declare @a int,

@b int,

@id int,

@name varchar(100),

@oldId int,--原ID号

@oldName varchar(100)--原来的name

set @a=0

set @b=0

if exists(select * from inserted)--如果存在插入新的数据则设置@a=1

begin

set @a=1

end

if exists(select * from deleted)--如果存在删除数据则设置@b=1

begin

set @b=1

end

if (@a=1)and(@b=0)--新增:当插入表inserted存在数据而删除表deleted不存数据时,为新增 *** 作。

begin

select @id=id,@name=name from inserted

print '增加了ID号为【'+cast(@id as varchar(5))+'】Name为【'+@name+'】的数据!'

end

if (@a=1)and(@b=1)--修改:当插入表insertedt和删除表deleted都存在数据时,为修改 *** 作。

begin

select @id=id,@name=name from inserted

select @id=id,@oldname=name from deleted

print '修改了ID号为【'+cast(@id as varchar(5))+'】的数据Name由【'+@oldname+'】变为【'+@name+'】'

end

if (@a=0)and(@b=1)--删除:当插入表inserted不存在数据而删除表deleted存在数据时,为删除 *** 作。

begin

select @id=id,@name=name from deleted

print '删除了ID号为【'+cast(@id as varchar(5))+'】Name为【'+@name+'】的数据!'

end

END


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9952819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存