數據庫工程師復習重點:數據庫對象
1、 在關系數據庫中,SQL語言是應用程序和數據庫管理之間的主要編程接口;
2、 使用SQL語言編寫代碼時,可用兩種方法存儲和執行代碼:
(1) 在客戶端存儲代碼,并創建向數據庫管理系統發送SQL命令,并處理返回結果的應用程序;
(2) 將這些發送的SQL語句存儲在數據庫管理系統中,這些存儲在數據庫管理系統中的SQL語句就是存儲過程,然后再創建執行存儲過程并處理返回結果的應用程序。
3、 使用存儲過程的好處:
(1) 模塊化程序設計:只需創建一次存儲過程并將其存儲在數據庫中,以后就可以在應用程序中多次調用存儲過程;
(2) 提高性能:系統在創建存儲過程時對其進行分析和優化,并在第一次執行時進行語法檢查和編譯,編譯好的代碼放入內存中,以后再執行此存儲過程時,只需直接執行內存中的代碼,從而提高代碼的執行效率;
(3) 減少網絡流量:一個需要數百行SQL代碼完成的操作現在只需一條執行存儲過程的代碼即可實現,因此,不再需要在網絡中發送這些多語句;
(4) 可作為安全機制使用:
13.1.2 創建和執行存儲過程
1、 創建存儲過程的SQL語句為:CREATE PROCEDURE,語法格式為:
CREATE PROCEDURE 存儲過程名
[{@ 參數名 數據類型}[=default][OUTPUT]
][,…n]
AS
SQL語句[…n]
其中:
(1) default:表示參數的默認值。如果定義了默認值,則在執行存儲過程時,可以不必指定該參數的值,默認值必須是常量或NULL;
(2) OUTPUT:表明參數是輸出參數,該選項的值可以返回給存儲過程的調用者。
2、執行存儲過程的SQL語句是EXECUTE,語法格式:
CREATE EXECUTE 存儲過程名 [實參[,OUTPUT][,…n]]
1、 執行有多個輸入參數的存儲過程時,參數的傳遞方式有兩種:
(1) 按參數位置傳遞值:指執行存儲過程的EXEC語句中的實參的排列順序必須與定義存儲過程時定義的參數的順序一致;
(2) 按參數名傳遞值:指執行存儲過程的EXEC語句中要指明定義存儲過程時指定的參數的名字以及此參數的值,而不關心參數的定義順序。
2、 注意:
(1) 在執行有輸出參數的存儲過程時,執行語句中的變量名的后邊要加上OUTPUT修飾符;
(2) 在調用有輸出參數的存儲過程時,與輸出參數對應的是一個變量,此變量用于保存輸出參數返回的結果;
13.2 用戶自定義函數
13.2.1 基本概念
1、 用戶定義函數可以擴展數據操作的功能,它在概念上類似于一般的程序設計語言中定義的函數。
13.2.2 創建和調用標量函數
標量函數—返回單個數據值的函數;
1、定義標量函數
CREATE FUNCTION [擁有者名.] 函數名
([{@ 參數名[AS]標量數據類型[=default]}[,…n]])
RETURNS 返回值類型
[AS]
BEGIN
函數體
RETURN 標量表達式
END
(1) 同存儲過程一樣,函數的參數也可以有默認值。
(2) 標量表達式:指定標量函數返回的標量值。
2、 調用標量函數:
當調用標量函數時,必須提供至少由兩部分組成的名稱:函數擁有者名和函數名。可在任何允許出現表達式的SQL語句中調用標量函數,只要類型一致;
13.2.3 創建和調用內嵌表值函數
1、 創建內嵌表值函數,其語法為:
CREATE FUNCTION [擁有者名.] 函數名
([{@ 參數名[AS]標量數據類型[=default]}[,…n]])
RETURNS 返回變量 TABLE <表定義>
[AS]
BEGIN
函數體
RETURN
END
<表定義>::=({列定義|表約束}[,…n])
2、調用多語句表值函數
多語句表值函數的返回值是一個表,因此對多語句表值函數的使用也是放在SELECT語句的FROM子句中。
13.3 觸發器
13.3.1 觸發器基本概念
1、 觸發器是一種特殊的存儲過程,其特殊性在于它不需要由用戶來調用,而是當用戶對表中的數據進行UPDATE、INSERT或DELETE操作時自動觸發執行;
2、 觸發器常用于下列場合:
(1) 完成比CHECK的約束更復雜的數據約束;
(2) 為保證數據庫性能而維護的非規范化數據;
(3) 實現復雜的業務規則,可使業務的處理任務自動進行。
13.3.2 創建觸發器
1、 創建觸發器的語句:CREATE TRIGGER,語法為:
CREATE TRIGGER 觸發器名稱
ON {表名| 視圖名}
[WITH ENCRYPTION]
{FOR |AFTER|INSTEAD OF}{[INSERT][,][DELETE][,][UPDATE]}
AS
[{IF UPDATE(column)…}]
SQL語句
(1) 觸發器名稱在數據庫中必須是惟一的;
(2) ON子句用于指定在其上執行觸發器的表;
(3) AFTER:指定觸發器只有在引發的SQL語句中指定的操作都已成功執行,并且所有的約束檢查也成功完成后,才執行此觸發器,這種觸發器稱為后觸發型觸發器;
(4) FOR:作用同AFTER;
(5) INSTEAD OF:指定執行觸發器而不是執行引發觸發器執行的SQL語句,從而替代觸發語句的操作,這種觸發器稱為前觸發型觸發器;
(6) INSTERT、DELETE或UPDATE是引發觸發器執行的操作,若同時指定多個操作,則各操作之間用逗號分隔;
2、 創建觸發器時,需要注意:
(1) 在一個表上可以建立多個名稱不同、類型各異的觸發器,每個觸發器可由三個操作引發;
(2) 大部分Transact-SQL語句都可用在觸發器中,但也有一些限制;
(3) 在觸發器定義中,可以使用IF UPDATE子句測試在INSERT和UPDATE語句中是否對指定字段有影響;
(4) 通常不要在觸發器中返回任何結果。
3、 創建后觸發型觸發器
使用FOR或AFTER選項定義的觸發器為后觸發的觸發器,即只有在引發觸發器執行語句中指定的操作都已完成執行,并且所有的約束檢查也成功完成后,才執行的觸發器;
4、 創建前觸發型觸發器
使用INSTEAD OF 選項定義的觸發器為前觸發型觸發器,在該觸發器中,指定執行觸發器而不是執行引發觸發器執行的SQL語句,從而替代引發語句的操作。
13.4 查看、修改及刪除對象
13.4.1 查看對象
對于創建好的存儲過程、函數可通過企業管理器和查詢分析器查看這些對象的代碼;
13.4.2 修改對象
1、 修改存儲過程:ALTER PROCEDURE
ALTER PROC 存儲過程名
[{@參數名 數據類型}[=default][OUTPUT]][,…n]
AS
SQL語句[…n]
修改與定義的語句基本一致,只將CREARE PROC 改成ALTER PROC;
2、修改用戶自定義函數:
修改與定義的語句基本一致,只將CREARE FUNCTION 改成ALTER FUNCTION;
3、修改觸發器:
修改與定義的語句基本一致,只將CREARE TRIGGER 改成ALTER TRIGGER;
13.4.3 刪除對象
1、 刪除存儲過程:
DROP PROCEDURE {存儲過程名}[,…n];
2、刪除用戶自定義函數
DROP FUNCTION {[擁有者名.]函數名}[,…n]
3、刪除觸發器
DROP TRIGGER {觸發器名}[,…n]