觸發器 儲存過程和函式三者有和區別

2021-08-30 14:16:45 字數 4358 閱讀 4687

觸發器是特殊的儲存過程,儲存過程需要程式呼叫,而觸發器會自動執行;你所說的函式是自定義函式吧,函式是根據輸入產生輸出,自定義只不過輸入輸出的關係由使用者來定義。在什麼時候用觸發器?要求系統根據某些操作自動完成相關任務,比如,根據買掉的產品的輸入數量自動扣除該產品的庫存量。什麼時候用儲存過程?儲存過程就是程式,它是經過語法檢查和編譯的sql語句,所以執行特別快。

儲存過程和使用者自定義函式具體的區別

先看定義:

儲存過程

儲存過程可以使得對資料庫的管理、以及顯示關於資料庫及其使用者資訊的工作容易得多。儲存過程是 sql 語句和可選控制流語句的預編譯集合,以乙個名稱儲存並作為乙個單元處理。儲存過程儲存在資料庫內,可由應用程式通過乙個呼叫執行,而且允許使用者宣告變數、有條件執行以及其它強大的程式設計功能。

儲存過程可包含程式流、邏輯以及對資料庫的查詢。它們可以接受引數、輸出引數、返回單個或多個結果集以及返回值。

可以出於任何使用 sql 語句的目的來使用儲存過程,它具有以下優點:

可以在單個儲存過程中執行一系列 sql 語句。

可以從自己的儲存過程內引用其它儲存過程,這可以簡化一系列複雜語句。

儲存過程在建立時即在伺服器上進行編譯,所以執行起來比單個 sql 語句快。

使用者定義函式

函式是由乙個或多個 transact-sql 語句組成的子程式,可用於封裝**以便重新使用。microsoft? sql server? 2000 並不將使用者限制在定義為 transact-sql 語言一部分的內建函式上,而是允許使用者建立自己的使用者定義函式。

可使用 create function 語句建立、使用 alter function 語句修改、以及使用 drop function 語句除去使用者定義函式。每個完全合法的使用者定義函式名 (database_name.owner_name.function_name) 必須唯一。

必須被授予 create function 許可權才能建立、修改或除去使用者定義函式。不是所有者的使用者在 transact-sql 語句中使用某個函式之前,必須先給此使用者授予該函式的適當許可權。若要建立或更改在 check 約束、default 子句或計算列定義中引用使用者定義函式的表,還必須具有函式的 references 許可權。

在函式中,區別處理導致刪除語句並且繼續在諸如觸發器或儲存過程等模式中的下一語句的 transact-sql 錯誤。在函式中,上述錯誤會導致停止執行函式。接下來該操作導致停止喚醒呼叫該函式的語句。

使用者定義函式的型別

sql server 2000 支援三種使用者定義函式:

標量函式

內嵌錶值函式

多語句錶值函式

使用者定義函式採用零個或更多的輸入引數並返回標量值或表。函式最多可以有 1024 個輸入引數。當函式的引數有預設值時,呼叫該函式時必須指定預設 default 關鍵字才能獲取預設值。該行為不同於在儲存過程中含有預設值的引數,而在這些儲存過程中省略該函式也意味著省略預設值。使用者定義函式不支援輸出引數。

標量函式返回在 returns 子句中定義的型別的單個資料值。可以使用所有標量資料型別,包括 bigint 和 sql_variant。不支援 timestamp 資料型別、使用者定義資料型別和非標量型別(如 table 或 cursor)。在 begin...end 塊中定義的函式主體包含返回該值的 transact-sql 語句系列。返回型別可以是除 text、ntext、image、cursor 和 timestamp 之外的任何資料型別。

錶值函式返回 table。對於內嵌錶值函式,沒有函式主體;表是單個 select 語句的結果集。對於多語句錶值函式,在 begin...end 塊中定義的函式主體包含 transact-sql 語句,這些語句可生成行並將行插入將返回的表中。有關內嵌錶值函式的更多資訊,請參見內嵌使用者定義函式。有關錶值函式的更多資訊,請參見返回 table 資料型別的使用者定義函式。

begin...end 塊中的語句不能有任何***。函式***是指對具有函式外作用域(例如資料庫表的修改)的資源狀態的任何永久性更改。函式中的語句唯一能做的更改是對函式上的區域性物件(如區域性游標或區域性變數)的更改。不能在函式中執行的操作包括:對資料庫表的修改,對不在函式上的區域性游標進行操作,傳送電子郵件,嘗試修改目錄,以及生成返回至使用者的結果集。

函式中的有效語句型別包括:

declare 語句,該語句可用於定義函式區域性的資料變數和游標。

為函式區域性物件賦值,如使用 set 給標量和表區域性變數賦值。

游標操作,該操作引用在函式中宣告、開啟、關閉和釋放的區域性游標。不允許使用 fetch 語句將資料返回到客戶端。僅允許使用 fetch 語句通過 into 子句給區域性變數賦值。

控制流語句。

select 語句,該語句包含帶有表示式的選擇列表,其中的表示式將值賦予函式的區域性變數。

insert、update 和 delete 語句,這些語句修改函式的區域性 table 變數。

execute 語句,該語句呼叫擴充套件儲存過程。

在查詢中指定的函式的實際執行次數在優化器生成的執行計畫間可能不同。示例為 where 子句中的子查詢喚醒呼叫的函式。子查詢及其函式執行的次數會因優化器選擇的訪問路徑而異。

使用者定義函式中不允許使用會對每個呼叫返回不同資料的內建函式。使用者定義函式中不允許使用以下內建函式:

[table]

|@@connections|@@pack_sent|getdate

|@@cpu_busy|@@packet_errors|getutcdate

|@@idle|@@timeticks|newid

|@@io_busy|@@total_errors|rand

|@@max_connections|@@total_read|textptr

|@@pack_received|@@total_write|

[/table]

架構繫結函式

create function 支援 schemabinding 子句,後者可將函式繫結到它引用的任何物件(如表、檢視和其它使用者定義函式)的架構。嘗試對架構繫結函式所引用的任何物件執行 alter 或 drop 都將失敗。

必須滿足以下條件才能在 create function 中指定 schemabinding:

該函式所引用的所有檢視和使用者定義函式必須是繫結到架構的。

該函式所引用的所有物件必須與函式位於同一資料庫中。必須使用由一部分或兩部分構成的名稱來引用物件。

必須具有對該函式中引用的所有物件(表、檢視和使用者定義函式)的 references 許可權。

可使用 alter function 刪除架構繫結。alter function 語句將通過不帶 with schemabinding 指定函式來重新定義函式。

呼叫使用者定義函式

當呼叫標量使用者定義函式時,必須提供至少由兩部分組成的名稱:

select *, myuser.myscalarfunction()from mytable

可以使用乙個部分構成的名稱呼叫錶值函式:

select *from mytablefunction()

然而,當呼叫返回表的 sql server 內建函式時,必須將字首 :: 新增至函式名:

select * from ::fn_helpcollations()

可在 transact-sql 語句中所允許的函式返回的相同資料型別表示式所在的任何位置引用標量函式,包括計算列和 check 約束定義。例如,下面的語句建立乙個返回 decimal 的簡單函式:

create function cubicvolume-- input dimensions in centimeters (@cubelength decimal(4,1), @cubewidth decimal(4,1), @cubeheight decimal(4,1) )returns decimal(12,3) -- cubic centimeters.asbegin return ( @cubelength * @cubewidth * @cubeheight )end

然後可以在允許整型表示式的任何地方(如表的計算列中)使用該函式:

create table bricks ( brickpartnmbr int primary key, brickcolor nchar(20), brickheight decimal(4,1), bricklength decimal(4,1), brickwidth decimal(4,1), brickvolume as ( dbo.cubicvolume(brickheight, bricklength, brickwidth) ) )

dbo.cubicvolume 是返回標量值的使用者定義函式的乙個示例。returns 子句定義由該函式返回的值的標量資料型別。begin...end 塊包含乙個或多個執行該函式的 transact-sql 語句。該函式中的每個 return 語句都必須具有乙個引數,可返回具有在 returns 子句中指定的資料型別(或可隱性轉換為 returns 中指定型別的資料型別)的資料值。return 引數的值是該函式返回的值

儲存過程和儲存函式和觸發器示例

oracle的 scott使用者 1 儲存過程示例 為指定的職工在原工資的基礎上長10 的工資 sql createorreplaceprocedureraisesalary empidinnumber aspsalemp.sal type begin selectsalintopsalfromem...

儲存過程和觸發器

儲存過程 stored procedure 是在大型資料庫系統中,一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。簡單的敘述 在大型資料庫系統中,儲存過程和觸發器具有很重要的作用。無論是儲存過程還是觸發器,都是s...

儲存過程和觸發器

1 什麼是儲存過程呢?定義 將常用的或很複雜的工作,預先用sql語句寫好並用乙個指定的名稱儲存起來,那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫execute,即可自動完成命令。講到這裡,可能有人要問 這麼說儲存過程就是一堆sql語句而已啊?microsoft公司為什麼還要...