Sybase触发器

这几日需要设计项目的几个报表统计模块,然后统计其数值。时间甚赶,需要新增一堆表,且以前的一个主表被修改并没有对应的log表,得重新设计。写log表要求使用触发器实现。

   所以在网上查找半天sybase的触发器,却没发现多少有完整意义的文章。(有一些,但似乎一定程度上都存在误导人的作用。可能是sybase的版本不一样,所以语法不一致。下文介绍的是sybase 12.5.1的文档)

   晚上吃完大餐回来,记起我以前也收藏不少sybase的标准文档资料。打开“知识库\P003_数据库篇\Sybase资料\Sybase 参考手册:命令.pdf”,果然有一节"create trigger"介绍,完整且详细,贴出来:

create trigger
说明创建触发器,即一种经常用来强制实现完整性约束的存储过程。当用户试图在指定表上使用指定的数据修改语句时,触发器就会自动执行。
语法

create trigger [owner .]trigger_name
on [owner .]table_name
for {insert , update , delete}
as SQL_statements
或使用 if update 子句:
create trigger [owner .]trigger_name
on [owner .]table_name
for {insert , update}
as
[if update (column_name )
[{and | or} update (column_name )]...]
SQL_statements
[if update (column_name )
[{and | or} update (column_name )]...
SQL_statements ]...


参数

trigger_name
是触发器的名称。它必须符合标识符的规则,并且在数据库中是唯一的。指定所有者的名称,以创建由当前数据库中的其他用户拥有的另一个同名触发器。owner 的缺省值是当前用户。如果使用所有者名限
定触发器,则必须以相同的方式显式限定表名。不能对触发器名使用变量。
table_name
是要在其上创建触发器的表的名称。如果数据库中存在多个同名表,请指定所有者名称。owner 的缺省值是当前用户。
insert、update、delete
可以包括在任意组合中。delete 不能与 if update 子句一起使用。
SQL_statements
指定触发器状态和触发器动作。触发器状态决定尝试的 insert、update或 delete 是否会导致执行触发器动作。SQL 语句通常包括前面带关键字 if 的子查询。在下面的示例 2 中,跟随关键字 if 的子查询即为触发
器状态。
触发器行为在尝试用户动作(insert、update 或 delete)时生效。如果指定了多个触发器动作,用 begin 和 end 将它们组合在一起。

if update
用于测试指定列是否包括在 update 语句的 set 列表中或是否受 insert 的影响。这允许指定的触发器动作与指定列的更新建立关联(请参见示例 3)。可以指定多列,且可以在一个 create trigger 语句中使用多个
if update 语句(请参见示例 5)。

示例

示例 1 如果有人试图在 titles 表中添加或更改数据将显示消息:
create trigger reminder
on titles
for insert, update as
print "Don't forget to print a report for accounting."
示例 2 如果 titles 表中没有相应的 title_id,则禁止向 titleauthor 插入新行:
create trigger t1
on titleauthor
for insert as
if (select count(*)
from titles, inserted
where titles.title_id = inserted.title_id) = 0
begin
print "Please put the book's title_id in the
titles table first."
rollback transaction
end
示例 3 如果更改了 publishers 表的 pub_id 列,请在 titles 表中进行相应的更改:
create trigger t2
on publishers
for update as
if update (pub_id) and @@rowcount = 1
begin
update titles
set titles.pub_id = inserted.pub_id
from titles, deleted, inserted
where deleted.pub_id = titles.pub_id
end

示例 4 如果从 titleauthor 中删除了行,则从 titles 表中删除相应的标题。
如果书有多个作者, titleauthor 中对它的其它引用也将删除:
create trigger t3
on titleauthor
for delete as
begin
delete titles
from titles, deleted
where deleted.title_id = titles.title_id
delete titleauthor
from titleauthor, deleted
where deleted.title_id = titleauthor.title_id
print "All references to this title have been
deleted from titles and titleauthor."
end
示例 5 禁止在周末对主键进行更新。禁止更新 title 的 price 或 advance,
除非该 title 的总收入超过了其 advance 的量:
create trigger stopupdatetrig
on titles
for update
as
if update (title_id)
and datename(dw, getdate())
in ("Saturday", "Sunday")
begin
rollback transaction
print "We don't allow changes to"
print "primary keys on the weekend!"
end
if update (price) or update (advance)
if (select count(*) from inserted
where (inserted.price * inserted.total_sales)
< inserted.advance) > 0
begin
rollback transaction
print "We don't allow changes to price or"
print "advance for a title until its total"
print "revenue exceeds its latest advance."
end

 

.......后面省略,需要的请到sybase官方网站去找官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值