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

觸發器存儲過程

發布時間: 2023-03-13 11:16:08

1. 存儲過程,函數和觸發器的區別

存儲過程,可以返回多個值,函數只能一個;觸發器是一個特殊的存儲過程。當他滿足一當條件時執行,例子:如果幾個有關聯的表,其中主表的數據刪除了~那麼子表的也要一起刪掉。這情況可以用觸發,當主表數據刪除時觸發其它的操作。

2. 資料庫存儲過程、函數、觸發器的區別是什麼

三者差別:

1、存儲過程實現的功能要復雜一點,而函數實現的功能針對性比較強。;

2、存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用;

3、觸發器是特殊的存儲過程,存儲過程需要程序調用,而觸發器會自動執行。

分別含義:

1、存儲過程的特點

①存儲過程只在創建時進行編譯,以後執行存儲過程都不需再重新編譯,而一般sql語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。

② 當對資料庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來。

③可以在過程中調用另一個存儲過程。可以在存儲過程中調用函數。這可以簡化一系列復雜語句。

④ 安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。

⑤參數有三種(IN、OUT、IN OUT),可返回多個參數值。

⑥在ORACLE中,若干個有聯系的過程可以組合在一起構成程序包。

⑦存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。

2、函數的特點

①函數只有一種參數(IN),只有一條RETURN語句,只能返回單一的值。

②可在SQL語句(DML或SELECT)中調用函數。由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。

3、觸發器的特點

觸發器是特殊的存儲過程,存儲過程需要程序調用,而觸發器會自動執行。

3. 存儲過程的觸發器

觸發器是一種特殊類型的存儲過程,它不同於我們前面介紹過的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如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

4. 如何在存儲過程中建立觸發器

(1).存儲過程:
create
procere
for_select(你想用的觸發器名字)
delare
@name
char(8)
output(用於輸出的),@age
int
output(用於輸出),@phone_num
char(11)
(輸入)
as
select
@name=name(列名),@age=age(列名)
from
table_name(表名)
where
phone_num(列名)=@phone_num
(2)觸發器
create
tigger
for_update
on
table_name
after
update
as
if(update(phone_num))
update
table_name2
set
phone_num=i.phone_num
from
deleted
d,inserted
i
where
table_name.phone_num=d.phone_num
end
其中:deleted與inserted是sql中默認的臨時表。用來儲存原來的值和插入的值。本觸發器的作用是
當更新table_name
中的phone_num時table_name1中的phone_num也一起更新!注意觸發器只能用於update.insert.delete.select中不能用於創建表............

5. 資料庫裡面的表、觸發器、存儲過程、視圖這些都是什麼東西

表:裡面存儲的都是真實的數據
視圖:就是一個表或者多個表的一個映射,一般只做查詢使用。比如你想要的數據存在兩個表裡,但你查詢時不想每次都寫關聯,那麼你創建一個視圖,以後只查詢這個視圖就可以(查詢時視圖與查詢表語法一樣)。
觸發器:做資料庫操作的時候,還希望相關的數據同步操作就用觸發器,比如想要向A表插入數據的時候,同時向B表插入,這樣寫過觸發器每次向A表插入數據之後就會自動向B表插入。
存儲過程:這個一般是沉澱數據使用的,當你需要查詢的數據不能用一個sql語句查出或者sql語句查詢速度特別慢,想要提高效率,就會用到存儲過程,先把需要的數據沉澱到結果表裡然後直接查詢結果表就能提高效率。

熱點內容
安卓怎麼錄屏只錄一點 發布:2025-05-19 17:12:39 瀏覽:521
甘肅移動服務密碼在哪裡 發布:2025-05-19 17:11:15 瀏覽:541
java內部類訪問外部類方法 發布:2025-05-19 17:10:30 瀏覽:286
用解壓造句 發布:2025-05-19 17:01:55 瀏覽:341
openwrt編譯取消跑碼 發布:2025-05-19 16:50:28 瀏覽:125
知道了寬頻賬號密碼如何連接 發布:2025-05-19 16:49:49 瀏覽:656
時間輪資料庫 發布:2025-05-19 16:45:20 瀏覽:269
ipad緩存垃圾怎麼清理 發布:2025-05-19 16:44:46 瀏覽:536
視頻加解壓 發布:2025-05-19 16:35:28 瀏覽:7
c語言大學教程第六版 發布:2025-05-19 16:04:21 瀏覽:741