1. 程式人生 > >Sybase觸發器學習

Sybase觸發器學習

這幾日需要設計專案的幾個報表統計模組,然後統計其數值。時間甚趕,需要新增一堆表,且以前的一個主表被修改並沒有對應的log表,得重新設計。寫log表要求使用觸發器實現。

  所以在網上查詢半天sybase的觸發器,卻沒發現多少有完整意義的文章。(有一些,但似乎一定程度上都存在誤導人的作用。可能是sybase的版本不一樣,所以語法不一致。下文介紹的是sybase12.5.1的文件)

  晚上吃完大餐回來,記起我以前也收藏不少sybase的標準文件資料。開啟“知識庫\P003_資料庫篇\Sybase資料\Sybase參考手冊:命令.pdf”,果然有一節"create trigger"介紹,完整且詳細,貼出來:

createtrigger
說明建立觸發器,即一種經常用來強制實現完整性約束的儲存過程。當用戶試圖在指定表上使用指定的資料修改語句時,觸發器就會自動執行。
語法

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官方網站去找官方文件。