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 表中的行是触发器表中新行的副本。

DML触发器有三类:

1, insert触发器;

2, update触发器;

3, delete触发器;

触发器的组成部分:

触发器的声明,指定触发器定时,事件,表名以类型

触发器的执行,PL/SQL块或对过程的调用

触发器的限制条件,通过where子句实现

类型:

应用程序触发器,前台开发工具提供的;

数据库触发器,定义在数据库内部由某种条件引发;分为:

DML触发器;

数据库级触发器;

替代触发器;

DML触发器组件:

1,触发器定时

2,触发器事件

3,表名

4, 触发器类型

5, When子句

6, 触发器主体

可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例

创建DML触发器:

Create [or replace] trigger [模式.]触发器名

Before| after insert|delete|(update of 列名)

On 表名

[for each row]

When 条件

PL/SQL块

For each row的意义是:在一次 *** 作表的语句中,每 *** 作成功一行就会触发一次;不写的话,表示是表级触发器,则无论 *** 作多少行,都只触发一次;

When条件的出现说明了,在DML *** 作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;

Insert触发器的创建:

create or replace trigger tg_insert

before insert on student

begin

dbms_output.put_line('insert trigger is chufa le .....')

end

执行的效果:

SQL>insert into student

2 values(202,'dongqian','f')

insert trigger is chufa le .....

update表级触发器的例子:

create or replace trigger tg_updatestudent

after update on student

begin

dbms_output.put_line('update trigger is chufale .....')

end

运行效果:

SQL>update student set se='f'

update trigger is chufale .....

已更新8行;

可见,表级触发器在更新了多行的情况下,只触发了一次;


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

原文地址: http://outofmemory.cn/sjk/10829824.html

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

发表评论

登录后才能评论

评论列表(0条)

保存