當前位置:首頁 » 存儲配置 » 觸發器及存儲過程實驗

觸發器及存儲過程實驗

發布時間: 2022-07-12 12:54:29

存儲過程的觸發器

觸發器是一種特殊類型的存儲過程,它不同於我們前面介紹過的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如Update、 Insert、 Delete 這些操作時,sql Server 就會自動執行觸發器所定義的SQL 語句,從而確保對數據的處理必須符合由這些SQL 語句所定義的規則。
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:
(1) 強化約束(Enforce restriction)
觸發器能夠實現比CHECK 語句更為復雜的約束。
(2) 跟蹤變化Auditing changes
觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。
(3) 級聯運行(Cascaded operation)。
觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
(4) 存儲過程的調用(Stored procere invocation)。
為了響應資料庫更新,觸發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在DBMS(資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在數據修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外一個表的同一類型(Insert、 Update、 Delete)的多個觸發器能夠對同一種數據操作採取多種不同的處理。
總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。 SQL Server 2000 支持兩種類型的觸發器:AFTER 觸發器和INSTEAD OF 觸發器。其中AFTER觸發器即為SQL Server 2000 版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(Insert Update Delete) 之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於AFTER觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder 來完成此任務。
INSTEAD OF觸發器表示並不執行其所定義的操作(Insert、 Update、 Delete),而僅是執行觸發器本身。既可在表上定義INSTEAD OF觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF 觸發器。 Create procere procere_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解釋:
output:表示此參數是可傳回的
with {recompile|encryption}
recompile:表示每次執行此存儲過程時都重新編譯一次
encryption:所創建的存儲過程的內容會被加密
如:
表book的內容如下
編號 書名 價格
001 C語言入門 $30
002 PowerBuilder報表開發 $52
實例1:查詢表Book的內容的存儲過程
create proc query_book
as
select * from book
go
exec query_book
實例2:
加入一筆記錄到表book,並查詢此表中所有書籍的總金額 Createprocinsert_book@param1char(10),@param2varchar(20),@param3money,@---------加密asinsertintobook(編號,書名,價格)Values(@param1,@param2,@param3)select@param4=sum(價格)frombookgo執行例子:declare@total_pricemoneyexecinsert_book顛','Delphi控制項開發指南',$100,@total_priceoutputprint'總金額為'+convert(varchar,@total_price)go存儲過程的3種傳回值:
1)、以Return傳回整數
2)、以output格式傳回參數
3)、Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。
實例3:
設有兩個表為Proct,Order_,其表內容如下:
Proct
產品編號 產品名稱 客戶訂數
001 鋼筆 30
002 毛筆 50
003 鉛筆 100
Order_
產品編號 客戶名 客戶訂金
001 南山區 $30
002 羅湖區 $50
003 寶安區 $4
請實現按編號為連接條件,將兩個表連接成一個臨時表,該表只含編號.產品名.客戶名.訂金.總金額,
總金額=訂金*訂數,臨時表放在存儲過程中
代碼如下:
Create proc temp_sale
as
select a.產品編號,a.產品名稱,b.客戶名,b.客戶訂金,a.客戶訂數* b.客戶訂金 as總金額
into #temptable from Proct a inner join Order_ b on a.產品編號=b.產品編號-----此處要用別名
if @@error=0
print 'Good'
else
print 'Fail'
go

② 觸發器實驗並說明在上述各種狀態下執行的什麼功能

定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發器,這里不提)

我為什麼要使用觸發器?比如,這么兩個表:

Create Table Student( --學生表
StudentID int primary key, --學號
.
)

Create Table BorrowRecord( --學生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間

)

用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。

這時候可以用到觸發器。對於1,創建一個Update觸發器:

Create Trigger truStudent
On Student --在Student表中創建觸發器
for Update --為什麼事件觸發
As --事件觸發後所要做的事情
if Update(StudentID)
begin

Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID

end

理解觸發器裡面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表「舊的一條記錄」和「新的一條記錄」。 一個資料庫系統中有兩個虛擬表用於存儲在表中記錄改動的信息,分別是:
虛擬表Inserted 虛擬表Deleted在表記錄新增時 存放新增的記錄 不存儲記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不存儲記錄 存放被刪除的記錄
一個Update 的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然後刪除Student記錄並寫入新紀錄。

對於2,創建一個Delete觸發器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID

從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
這里我們只講解最簡單的觸發器。復雜的容後說明。
事實上,我不鼓勵使用觸發器。觸發器的初始設計思想,已經被「級聯」所替代

③ Mysql 觸發器 和 存儲過程

我就給你描述一下簡單易懂的吧,第一個存儲過程,例子:輸入一個 名字,返回改名字的人的 居住地址!代碼:create procere 過程名字( name varcha2) is
v varchar2(100);
begin
select s_address into v from 表 where s_name= name;
dbms_output.put_line('該名字居住的地址是:|| v');
end; 這個存儲過程的。比較簡單。的例子。
觸發器,指的是:可以限制你往表裡添加數據,比如,我建立觸發器,比如不讓你在當天的12:00:00之,對你的這個表進行操作。具體代碼:
create or replace trigger 觸發器名字
before update or insert or delete
on 你的表
declare v_date date;
begin
select sysdate into v_date from al;
if(v_date<to_date('2012-11-16 12:00:00','yyyy-mm-dd hh24:mi:ss'))
then dbms_output.put_line('這個時間不可以更改數據');
end if;
end;
我都親自測試的。呵呵 ,這樣如果你在12之前對表進行,曾刪改,就會報出『這個時間不可以改數據的』字樣。我的例子通熟易懂,希望給點分。呵呵,不會的咱倆可以研究。

④ 存儲過程和觸發器

PROCEDURE
p_book1
PROCEDURE p_book2
書名='大學英語'
EXEC p_book2
圖書編號=@x
'001105'
varchar(20)
書籍表 where 書名=@c1
EXEC p_book4 '大學語文'

⑤ 使用SQLServer查詢分析器創建存儲過程和觸發器

sql server 2000 第8章及第九章課後習題答案.

⑥ 如何測試mysql觸發器和存儲過程

1.
為了測試觸發器和存儲過程,首先建立一張簡單的表:
復制代碼
代碼如下:
CREATE
TABLE
`airuser`
(
`userId`
int(11)
NOT
NULL
AUTO_INCREMENT,
`username`
varchar(128)
NOT
NULL,
PRIMARY
KEY
(`userId`)
)ENGINE=InnoDB
DEFAULT
CHARSET=utf8
2.
為該表的插入操作,創建一張記錄表:
復制代碼
代碼如下:
CREATE
TABLE
`airuser_record`
(
`id`
int(11)
NOT
NULL
AUTO_INCREMENT,
`username`
varchar(45)
DEFAULT
NULL,
`edittime`
timestamp
NULL
DEFAULT
NULL,
`edittype`
varchar(45)
DEFAULT
NULL,
PRIMARY
KEY
(`id`)
)
ENGINE=InnoDB
DEFAULT
CHARSET=utf8
3.
編寫一個插入操作的觸發器:
復制代碼
代碼如下:
DROP
TRIGGER
insert_trigger;
delimiter
|
CREATE
TRIGGER
insert_trigger
BEFORE
INSERT
ON
airuser
FOR
EACH
ROW
BEGIN
INSERT
INTO
airuser_record
SET
username
=
NEW.username,
edittime=now(),
edittype='insert';
END;
SHOW
TRIGGERS;
4.
為批量插入編寫存儲過程:
復制代碼
代碼如下:
DROP
procere
createUsers;
delimiter
|
create
procere
createUsers(IN
count
int)
begin
declare
i
int;
set
i=0;
while
i<count
do
insert
into
airuser
set
username=concat('user_',i);
set
i=i+1;
end
while;
end;
show
procere
status;
5.
調用存儲過程,驗證存儲過程是工作的,並驗證在插入記錄前,觸發器能正確被觸發:
復制代碼
代碼如下:
call
createUsers(10);
6.
最後通過插入記錄表再次驗證:
復制代碼
代碼如下:
SELECT
*
FROM
mars_jpa.airuser_record;

熱點內容
電腦上怎麼看本機的配置 發布:2024-10-08 13:26:02 瀏覽:41
androidepub 發布:2024-10-08 13:25:22 瀏覽:549
怎麼拿雲伺服器做進銷存 發布:2024-10-08 13:25:14 瀏覽:724
小本解說伺服器是什麼 發布:2024-10-08 13:25:09 瀏覽:393
安卓倍速腳本 發布:2024-10-08 13:18:48 瀏覽:77
飢荒本地伺服器後續怎麼添加伺服器模組 發布:2024-10-08 13:18:24 瀏覽:199
阿里雲伺服器centos7還是8 發布:2024-10-08 13:16:16 瀏覽:718
安卓手機的屏幕設置在哪裡 發布:2024-10-08 13:14:37 瀏覽:702
解壓車禍 發布:2024-10-08 12:50:16 瀏覽:636
我的世界天空之鏡伺服器文件夾 發布:2024-10-08 12:49:38 瀏覽:75