存儲過程實驗
『壹』 oracle存儲過程失效重啟後恢復正常
根據oracle資料庫的特點和提供的工具,主要方法有以下幾種方法:
利用邏輯備份使用import工具丟失數據的表
利用物理備份來通過還原數據文件並進行不完全恢復
利用dbms_logmnr包從redo log文件中恢復
利用flashback特性恢復數據
前提
為了方便使用方法的介紹,上述恢復方法都將基於以下場景進行:系統管理員在前一天晚上11點用export對資料庫做了全庫邏輯備份,然後對所有數據文件進行了熱備份。第二天上午10點,系統管理員在修改表TFUNDASSET的數據時,由於修改語句的條件寫錯了,導致一批記錄(幾千條)的ztm欄位被修改成了錯誤的值,而且已經提交。這個表是資產表,相對而言數據變化不頻繁。
一、利用邏輯備份使用import工具恢復丟失的數據
export/import是oracle提供的用於對資料庫進行邏輯備份的工具。該工具適用於備份那些數據量不大、業務量不多的資料庫系統。因為如果在前一天晚上11點用export做了邏輯備份,那麼當今天上午10點資料庫意外崩潰時,從備份起到資料庫崩潰的這段時間里的數據修改操作(包括DDL和DML)都會丟失。如果丟失數據內的表上的數據是相對比較穩定,也就是說該表上基本沒有DML操作,例如標准代碼表、分區表裡的歷史數據,那麼採用import來導入該表可以比較完整的恢復數據。如果該表是經常變化的業務表,那麼這些丟失的數據只能根據業務情況從紙質記錄恢復,或者其他途徑恢復。
▲示例如下:這個表是一個資產表。相對來說,今天系統運行中修改的數據較少,丟失的數據量可以承受或者可以從別的途徑恢復。那就可以用import來恢復。
方法一:
1、把這個表的數據備份到另一個表:
.png
2、刪除該表的記錄:
.png
3、執行下面的命令:
.png
這個命令中在關鍵字tables中指定需要導入的表名字,ignore=y表示忽略表已經存在的錯誤。
4、導入結束後,檢查表中的記錄,並用適當的方法恢復當天的修改。
方法二:
1、 把需要恢復的表導入到另一個用戶下面:
.png
2、檢查數據以後,把原表記錄刪除:
.png
3、然後從另一用戶表中插入回去:
.png
4、 數據量比較大時可以採用如下方法:
.png
二、利用物理備份來通過還原數據文件並進行不完全恢復
如果資料庫運行在歸檔模式下,那麼可以通過使用以前的數據文件備份進行還原,然後利用歸檔日誌進行前滾,直到回滾到錯誤操作的時間點前,然後重置日誌文件打開資料庫。
可以通過下列方法確認是否是運行在歸檔模式:
.png
如果是如上所示,那麼就是運行在歸檔模式了。
▲假定在前一天晚上11點做了全庫物理備份,那麼可以考慮如下恢復:
1、關閉資料庫:
由於資料庫的不完全恢復必須在一個關閉的資料庫上實施,利用一個舊的資料庫的備份還原,然後用日誌根據需要逐步前滾,而不能還原一個新的備份,再回退到某個時間點。
通知各客戶端資料庫將關閉,然後發出:
.png
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
2、確定錯誤操作的時間:
可以根據操作員的估計來確定不完全恢復需要前滾停止的時間,也可以利用LogMiner來分析日誌文件(這個工具將在後面介紹),找出錯誤操作的准確時間。
3、還原數據文件:
先對當前的資料庫文件進行備份,然後再用以前的最近一次備份覆蓋現有數據文件。注意:不覆蓋現有的控制文件。
4、基於時間點恢復,啟動資料庫到裝配狀態:
.png
這樣資料庫就恢復到了2015年10月20日的9點58分零秒。
然後再利用業務資料補充這段時間內的數據。
三、利用dbms_logmnr包從log文件中恢復
這個包是由Oracle提供,與dbms_logmnr_d包配合使用可以方便地分析聯機日誌文件和歸檔日誌文件,從這些日誌文件中提取出所有對資料庫的更改操作。
在使用這個包之前,需要先做一些設置和修改:
1、打開initorcl.ora,修改初始化參數utl_file_dir,設置dbms_logmnr_d包將要使用的數據字典文件的放置目錄。
.png
然後重啟資料庫使參數生效。
2、以sys用戶連接到資料庫執行dbmslmd.sql腳本重建dbms_logmnr_d這個包。
應用Logminer分析重做日誌文件的操作主要有以下步驟:
● 使用dbms_logmnr_d里的存儲過程build創建一個外部數據字典文件;
● 使用dbms_logmnr里的存儲過程add_logfile添加要分析的日誌文件;
● 使用dbms_logmnr里的存儲過程start_logmnr啟動分析;
● 查詢與dbms_logmnr相關的幾個視圖來獲取日誌文件內容;
● 使用dbms_logmnr里的存儲過程end_logmnr結束分析。
▲下面詳細講述使用的過程
1、使用dbms_logmnr_d里的存儲過程build創建一個外部數據字典文件:
.png
2、使用dbms_logmnr里的存儲過程add_logfile添加要分析的日誌文件到待分析文件列表:
.png
如果沒有運行在歸檔模式,那麼由於重做日誌文件的循環使用可能導致日誌文件被覆蓋而無法獲取到所要尋找的恢復條目。如果運行在歸檔模式,則可以通過查看$ORACLE_HOMEadminorclbmp目錄下的alert_orcl.log里日誌文件歸檔的時間和錯誤操作的時間來確定加入哪些歸檔日誌文件到待分析的文件列表中去。
.png
注意:執行以上過程時logfilename參數需要寫日誌文件的全路徑,否則會報錯。重復以上操作直到把所有需要分析的文件都加到列表中去。這樣就可以啟動進行分析。
3、使用dbms_logmnr里的存儲過程start_logmnr啟動分析;
.png
這樣就可以通過下面的查詢來獲取日誌文件的內容了。
4、查詢與dbms_logmnr相關的幾個視圖來獲取日誌文件內容;
.png
這樣就可以找出要恢復所需的語句。注意:v$logmnr_contents只對執行dbms_logmnr.start_logmnr的會話有效,如果通過其他會話或者使用dbms_logmnr.end_logmnr終止了分析,都將不能訪問v$logmnr_contents的數據。如果要使其他會話也能獲取到這些數據,可以通過另外建表來實現,如:
create table undo_sql as select * from v$logmnr_contents。
再對undo_sql進行授權,其他用戶就可以訪問v$logmnr_contents的數據了。
5、使用dbms_logmnr里的存儲過程end_logmnr結束分析。
使用完成以後用下面的命令來結束分析活動:exec dbms_logmnr.end_logmnr;
這樣就釋放了分配給logminer的資源(內存和數據結構)。
從上面的過程可知,如果是更新的數據量比較大,而日誌文件比較小,就可能會導致日誌文件的切換。如果沒有及時去挖掘日誌文件(沒有運行在歸檔模式),那麼可能會由於日誌文件的循環使用而導致數據不可恢復。如果運行在歸檔模式,也可能由於需要分析的日誌文件比較多而時間較長。
四、利用flashback新特性恢復數據
Oracle9i 開始提供了閃回查詢(Flashback Query)功能,對於誤刪除或者誤更新並且已經commit了的情況提供了簡便快捷的恢復方法;而在Oracle 提供閃回查詢之前,碰到這種情況只能通過備份來進行基於時間點的恢復或者使用logmnr挖掘日誌來恢復,無疑這比閃回查詢要麻煩而且費時。
使用這個Flashback Query特性的前提條件:
1. 資料庫必須處於Automatic Undo Management 狀態。
.png
2. 最大可以閃回查詢的時間段由UNDO_RETENTION 初始化參數(單位為秒)指定
.png
可以通過ALTER SYSTEM SET UNDO_RETENTION = ;來動態修改參數值。
▲如何使用Flashback Query來恢復數據呢?
1. 通過SQL
.png
使用SELECT 語句的AS OF 來進行閃回查詢,語法如下:
使用AS OF 關鍵字來對表,視圖或者物化視圖進行Flashback Query,如果指定了SCN,那麼expr 部分必須是一個數字,如果指定了TIMESTAMP,那麼expr 必須是一個timestamp類型的值。查詢結果將返回在指定的SCN 或者時間點上的數據。
下面我們使用scott 方案來作一個實驗。
.png
如果想在update 的子查詢部分使用AS OF,那麼該查詢只能返回一條記錄,否則將會報錯。
可以通過添加一個臨時表作為中轉,然後再作更新,如下:
.png
2.通過DBMS_FLASHBACK包來恢復
DBMS_FLASHBACK 包提供了以下幾個函數:
ENABLE_AT_TIME:設置當前SESSION 的閃回查詢時間
ENABLE_AT_SYSTEM_CHANGE_NUMBER:設置當前SESSION 的閃回查詢SCN
GET_SYSTEM_CHANGE_NUMBER:取得當前資料庫的SCN
DISABLE:關閉當前SESSION 的閃回查詢
當將一個SESSION 設置為閃回查詢模式之後,後續的查詢都會基於那個時間點或者SCN 的資料庫狀態,如果SESSION 結束,那麼即使沒有明確指定DISABLE,閃回查詢也會自動失效。
當SESSION 運行在閃回查詢狀態時,不允許進行任何DML 和DDL 操作。如果要用DML操作來進行數據恢復就必須使用PL/SQL 游標。
▲示例:
.png
通過上面的例子可以看出,只要這個修改的時間不早於sysdate- (UNDO_RETENTION指定的秒數),就可通過這種方式來恢復數據。
.png
對於問題中的批量數據,可以寫個過程來完成獲取到更改前的數據:
然後再用這個臨時表裡的數據來更新TFUNDASSET就可以了。
五、總結
比較以上幾種恢復數據的方法的使用過程,我們可以看出:
● exp/imp只適合於數據變化不大的表的數據丟失的情況,即使用這種方法處理後也需要從業務辦理資料中修正數據,否則導致數據丟失;
● 採用基於時間點的不完全恢復可以恢復丟失的數據,但是需要關關閉資料庫,減少系統可用時間,而且也會丟失恢復時間點以後的數據;
● 使用LogMiner可以較好的恢復數據,但是要求資料庫盡可能運行在歸檔模式,否則也可能導致數據丟失。好處是不用關閉系統,能夠從日誌文件中得到所有的數據。
● 使用Flashback最方便和簡潔,可以直接得到修改前的數據,但是需要依賴系統設置,並且需要佔用大量的回滾表空間。
因此選擇什麼樣的方法來恢復數據,取決於你的系統環境和具體情況,不能生搬硬套。採用正確的方法才能最大程度的減少數據的丟失。
當然,最好是不需要用到這些恢復的辦法。前提是,你必須做好以下的工作:
1、 為不同環境創建不同的資料庫用戶、不同密碼(如果不能用戶不同,一定要密碼不同);
2、 將owner和應用用戶分開,並做適度授權;
3、 在做DML前,先用同樣的條件做查詢,看根據結果集是否符合預期。
『貳』 資料庫實驗-sql存儲過程
CREATE PROCEDURE P1
@XH VARCHAR(10) AS
IF @XH NOT IN(SELECT 學號 FROM 選課) INSERT 選課 VALUES(@XH,'1',0)
ELSE IF NOT EXISTS(SELECT * FROM 選課 WHERE 學號=@XH AND 成績>=60)
DELETE FROM 選課 WHERE 學號=@XH
ELSE SELECT * FROM 選課 WHERE 學號=@XH
『叄』 求SQL資料庫實驗報告
*****系實驗(上機)報告
課程名稱 資料庫系統基礎
實驗名稱 數據查詢與存儲過程
學號 33
學生姓名 嘻習喜戲
成績
年 月 日
序號 5 實驗名稱 SQL數據查詢
實驗目的:
熟練掌握SQL SELECT 語句,能夠運用該語句完成各種查詢。
實驗內容:
用SQL SELECT 語句完成下列查詢:
1. 查詢客戶表中的所有記錄。
2. 從訂購單表中查詢客戶號信息(哪些客戶有訂購單)。
3. 查詢單價在20元以上(含)的產品信息。
4. 查詢單價在20元以上(不含)的產品名稱為牛奶的產品信息。
5. 查詢單價在20元以上(不含)的產品名稱為牛奶或德國乳酪的產品信息。
6. 查詢有2003年7月訂購單的客戶名稱、聯系人、電話號碼和訂單號信息。
7. 查詢有德國乳酪訂貨的客戶的名稱、聯系人和電話號碼信息。
8. 查詢有德國乳酪訂購需求的訂單名細記錄。
9. 查詢所有訂購數量(即訂單名細中每個訂購項目的數量)都在10個以上的訂購單的信息。
10. 找出和德國乳酪同等價位的所有產品信息。
11. 查詢單價范圍在10元到30元范圍內的產品信息(使用BETWEEN…AND)。
12. 從客戶表中查詢出客戶名稱中有「公司」二字的客戶信息(使用LIKE運算符)。
13. 從客戶表中查詢出客戶名稱中沒有「公司」二字的客戶信息(使用NOT LIKE運算符)。
14. 按產品的單價升序列出全部產品信息。
15. 先按產品名稱排序,再按單價排序列出全部產品信息。
16. 從產品表中查詢共有幾種產品。
17. 從訂購名細表中查詢德國乳酪的訂購總數。
18. 計算德國乳酪所有訂購的總金額。
19. 求所有訂購單的平均金額,在查詢結果中列出訂購單的個數和平均金額。
20. 求每個訂購單訂購的項目數和總金額。
21. 求每個客戶包含了德國乳酪訂購的訂單號及其最高金額和最低金額。
22. 求至少有兩個訂購項目的訂購單的平均金額。
23. 找出尚未最後確定訂購單(即訂購日期為空值的記錄)的有關客戶信息(客戶的名稱、聯系人和電話號碼)和訂單號。
24. 找出在2000年1月1日之後簽訂的訂購單的客戶信息(客戶的名稱、聯系人和電話號碼)、訂單號和訂購日期。
25. 列出每類產品(相同名稱)具有最高單價的產品信息(產品號、名稱、規格說明和單價,提示:使用內外層互相關嵌套查詢)。
26. 確定哪些客戶目前沒有訂購單(使用謂詞NOT EXISTS)。
27. 查詢目前有訂購單的客戶的信息(使用謂詞EXISTS)。
28. 查詢符合條件的產品信息,要求該產品的單價達到了任意一款產品名稱為牛奶的單價的一半(使用ANY或SOME量詞)。
29. 查詢符合條件的產品信息,要求該產品的單價大於任何一款產品名稱為牛奶的單價(使用ALL量詞)。
30. 設計如下的連接操作,並分析各自的特點:
•廣義笛卡兒積
•內連接
•外連接
•左連接
•右連接
•全連接
掌握存儲過程的創建命令,按照題目要求創建存儲過程,理解存儲過程的作用。
(1) 建立存儲過程。查詢單價范圍在x元到y元范圍內的產品信息。
(2) 建立存儲過程。查詢在某年某月某日之後簽訂的訂購單的客戶信息(客戶的名稱、聯系人和電話號碼)、訂單號和訂購日期。
(3) 建立存儲過程。將某產品的訂購日期統一修改為一個指定日期。
(4) 建立存儲過程。刪除沒有簽訂單的客戶信息。
實驗要求:
用SELECT語句完成本次實驗,並提交上機報告。
(1) 掌握存儲過程的創建命令,按照實驗內容的要求創建存儲過程,理解存儲過程的作用。
(2) 用CREATE PROCEDURE和EXECUTE 語句完成本次實驗,並提交上機報告。
實驗准備(本實驗預備知識和為完成本實驗所做的准備):
仔細閱讀課本第五章關於SQL的數據查詢功能的內容
實驗過程(實驗的操作過程、遇到的問題及其解決辦法或未能解決的問題):
用SQL SELECT 語句完成以上30題查詢
實驗總結(總結本次實驗的收獲、未解決的問題以及體會和建議等):
熟練掌握SQL SELECT 語句,能夠運用該語句完成各種查詢
附錄(SQL語句):
--1. 查詢客戶表中的所有記錄。
select * from 客戶
--2. 從訂購單表中查詢客戶號信息(哪些客戶有訂購單)
select 客戶號from 訂單where 訂單號!=null
--3. 查詢單價在元以上(含)的產品信息。
select *from 產品where 單價> 20 or 單價=20
--4. 查詢單價在元以上(不含)的產品名稱為牛奶的產品信息。
select *from 產品where 單價>20 and 產品名稱='牛奶'
--. 查詢單價在元以上(不含)的產品名稱為牛奶或德國乳酪的產品信息
select *from 產品where 單價>20 and (產品名稱='牛奶'or 產品名稱='德國乳酪')
--6. 查詢有年月訂購單的客戶名稱、聯系人、電話號碼和訂單號信息
select 客戶名稱,聯系人, 電話,訂單號from 客戶,訂單where (year(訂購日期)=2003 and month (訂購日期)=7)and (訂單.客戶號=客戶.客戶號)
--7. 查詢有德國乳酪訂貨的客戶的名稱、聯系人和電話號碼信息。
select 客戶名稱,聯系人, 電話from 客戶
where
(客戶號= (select 客戶號from 訂單where(訂單號 =(select 訂單號from 訂單明細
where 產品號= ( select 產品號from 產品where 產品名稱= ' 德國乳酪' )))))
--8. 查詢有德國乳酪訂購需求的訂單名細記錄。
select * from 訂單明細where (數量!=null and 產品號=(select 產品號from 產品where 產品名稱= '德國乳酪'))
--9. 查詢所有訂購數量(即訂單名細中每個訂購項目的數量)都在個以上的訂購單的信息。
select * from 訂單where (訂單號in (select 訂單號from 訂單明細where (數量>10)))
--10. 找出和德國乳酪同等價位的所有產品信息。
select * from 產品where (
--11. 查詢單價范圍在元到元范圍內的產品信息(使用BETWEEN…AND)。
select * from 產品where (單價between 10 and 30)
--12. 從客戶表中查詢出客戶名稱中有「公司」二字的客戶信息(使用LIKE運算符)
select * from 客戶where 客戶名稱like '%公司%'
--13. 從客戶表中查詢出客戶名稱中沒有「公司」二字的客戶信息(使用NOT LIKE運算符)。
select * from 客戶where 客戶名稱not like '%公司%'
--14. 按產品的單價升序列出全部產品信息。
select *from 產品order by 單價
--15. 先按產品名稱排序,再按單價排序列出全部產品信息。
select * from 產品order by 產品名稱,單價
--16. 從產品表中查詢共有幾種產品。
select count ( distinct 產品名稱) as 產品總數from 產品
--17. 從訂購名細表中查詢德國乳酪的訂購總數
select sum (數量) as '訂購乳酪數量'
from 訂單明細
where 產品號in(select 產品號from 產品where 產品名稱='德國乳酪')
--18. 計算德國乳酪所有訂購的總金額
declare @a money
select @a=(select 單價from 產品where 產品名稱='德國乳酪')
declare @b int
select @b=(select sum (數量) as '訂購乳酪數量'
from 訂單明細
where 產品號in(select 產品號from 產品where 產品名稱='德國乳酪'))
declare @c int
select @c=@a*@b
select @c as 總金額
--19. 求所有訂購單的平均金額,在查詢結果中列出訂購單的個數和平均金額。
select 訂單均值= avg(單價*數量) ,訂單個數=count ( 訂單號)
from 訂單明細,產品
where 產品.產品號=訂單明細.產品號
--20. 求每個訂購單訂購的項目數和總金額。
select 訂單號, count (產品.產品號) as 項目數,sum(數量*單價) as 總金額
from 產品,訂單明細
where (產品.產品號=訂單明細.產品號)
group by 訂單號
--21.求每個客戶包含了德國乳酪訂購的訂單號及其最高金額和最低金額
select 客戶.客戶號,產品.產品號,數量*單價as 總金額
from 客戶,訂單,訂單明細,產品
where 客戶.客戶號=訂單.客戶號and 訂單.訂單號=訂單明細.訂單號and 訂單明細.產品號=產品.產品號and
產品名稱='德國乳酪'
order by 客戶號
compute max(數量*單價),min (數量*單價) by 客戶號
--22.求至少有兩個訂購項目的訂購單的平均金額
select 訂單號,avg(數量*單價),count(產品.產品號)
from 訂單明細,產品
where 訂單明細.產品號=產品.產品號
group by 訂單號
having count(產品.產品號)>=2
--23.找出尚未最後確定訂購單(即訂購日期為空值的記錄)的有關客戶信息
-- (客戶的名稱、聯系人和電話號碼)和訂單號
select 客戶名稱,聯系人,電話,訂單明細.訂單號
from 客戶, 訂單明細,訂單
where(客戶.客戶號= 訂單.客戶號) and 訂購日期=null
--24.找出在年月日之後簽訂的訂購單的客戶信息
--(客戶的名稱、聯系人和電話號碼)、訂單號和訂購日期
select 客戶名稱,聯系人,電話,訂單號,訂購日期
from 客戶,訂單
where 客戶.客戶號=訂單.客戶號
and year(訂購日期)>1996 and month(訂購日期)>4 and day(訂購日期)>2
--25.列出每類產品(相同名稱)具有最高單價的產品信息
--(產品號、名稱、規格說明和單價,提示:使用內外層互相關嵌套查詢)
select A.產品號, A.產品名稱, A.規格說明, A.單價
from 產品A
where 單價= (SELECT MAX(單價)
FROM 產品B
WHERE A.規格說明= B.規格說明)
--26.確定哪些客戶目前沒有訂購單(使用謂詞NOT EXISTS)
select *
from 客戶
where not exists (select* from 訂單where 客戶號=訂單.客戶號)
--27.查詢目前有訂購單的客戶的信息(使用謂詞EXISTS)
select *
from 客戶
where exists (select* from 訂單where 客戶號=訂單.客戶號)
--28.查詢符合條件的產品信息,要求該產品的單價達到了任
--意一款產品名稱為牛奶的單價的一半(使用ANY或SOME量詞)
select *
from 產品a
where(單價>any(select 單價/2 from 產品b where b.產品名稱='牛奶'))
--29.查詢符合條件的產品信息,要求該產品的單價大於任何
-- 一款產品名稱為牛奶的單價(使用ALL量詞)
select *
from 產品a
where(單價>all(select 單價from 產品b where b.產品名稱='牛奶'))
--30.設計如下的連接操作,並分析各自的特點:
-- •廣義笛卡兒積
SELECT *
FROM 客戶CROSS JOIN 訂購單
WHERE 客戶.客戶號= 訂購單.客戶號
-- •內連接
SELECT *
FROM 客戶INNER JOIN 訂購單
ON 客戶.客戶號= 訂購單.客戶號
-- •外連接
-- •左連接
SELECT *
FROM 客戶LEFT JOIN 訂購單
ON 客戶.客戶號= 訂購單.客戶號
-- •右連接
SELECT *
FROM 客戶RIGHT JOIN 訂購單
ON 客戶.客戶號= 訂購單.客戶號
-- •全連接
SELECT *
FROM 客戶FULL JOIN 訂購單
ON 客戶.客戶號= 訂購單.客戶號
說明:
1. 上機報告上傳到211.68.36.251的資料庫文件夾中的上傳目錄
2. 文件名的命名規則為:學號+姓名+實驗+序號。如:9724101汪偉的第二次上機報告名為:9724101汪偉實驗2
3. 封面由學生填寫;
4. 正文的實驗名稱、實驗目的、實驗內容、實驗要求已經由教師指定;
5. 實驗准備由學生在實驗或上機之前填寫;
6. 實驗過程由學生記錄實驗的過程,包括操作過程、遇到哪些問題以及如何解決等;
7. 實驗總結由學生在實驗後填寫,總結本次實驗的收獲、未解決的問題以及體會和建議等;
8. 將相關的語句粘貼到附錄中。
你自己改改吧。想要word原版的話再說一聲。
『肆』 創建存儲過程 實驗內容 1.求共有多少個學生 sql語句
create proc p1 as
select count(*) 學生數 from 學生信息表
『伍』 使用SQLServer查詢分析器創建存儲過程和觸發器
sql server 2000 第8章及第九章課後習題答案.
『陸』 使用Transact-SQL創建函數和存儲過程的實驗感想
函數和存儲過程對SQL SERVER來說有很大的區別:
1.在SQL SERVER2K以前,沒有自定義函數UDF,只有系統函數。
2.無論系統函數和UDF,在系統啟動是就進行編譯並載入,所以UDF的效率比SP要高,SP只是在調用時才載入(擴展的存儲過程除外)。
3.有些函數getdate,exec..都在UDF里不能用!
4.函數必須有返回值,SP則不一定。
5.函數可以包括在FROM子句中,SP則不可以。
6.在SQL SERVE2K中SP可以DEBUG,UDF不可以。 用戶定義函數
函數是由一個或多個 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 錯誤。在函數中,上述錯誤會導致停止執行函數。接下來該操作導致停止喚醒調用該函數的語句。