存儲過程是預編譯的 T-SQL 批次,存儲於數據庫中,支持參數輸入/輸出、流程控制、錯誤處理與事務管理,是實現數據層業務封裝的首選機制。
sp_,存儲於 master 數據庫,提供實例級管理功能(如 sp_who、sp_help),調用時無需指定數據庫前綴。sp_ 前綴以防解析開銷。xp_,通過外部 DLL 實現(如 xp_cmdshell),可訪問作業系統資源,安全風險極高,生產環境建議禁用或嚴格限權。觸發器綁定於表/視圖的 DML(INSERT/UPDATE/DELETE)或 DDL(CREATE/ALTER/DROP)事件,無法顯式調用,由數據庫引擎在事件發生時自動激活。
| 特性 | 存儲過程 | 觸發器 |
|---|---|---|
| 調用方式 | 顯式 EXEC / CALL | 隱式,事件驅動自動觸發 |
| 事務上下文 | 可自主開啟/提交/回滾事務 | 運行於觸發事件的同一事務中,隱式事務 |
| 參數傳遞 | 支持輸入/輸出參數 | 無參數,通過 inserted/deleted 伪表獲取數據 |
| 返回結果集 | 可返回多個結果集 | 不應返回結果集(客戶端通常無法消費) |
| 嵌套與遞歸 | 支持嵌套調用(最多 32 級) | 支持嵌套觸發(可通過 sp_configure 'nested triggers' 禁用) |
sp_settriggerorder 指定首尾順序。inserted 與 deletedSQL Server 為每個觸發器執行上下文創建兩張內存驻留的邏輯表,結構與基表完全一致:
inserted:包含 INSERT 或 UPDATE 操作的新行(UPDATE 視為刪除舊行+插入新行)。deleted:包含 DELETE 或 UPDATE 操作的舊行。關鍵規則:
deleted 存舊值,inserted 存新值。CREATE TRIGGER trg_Goods_CascadeDelete
ON Goods
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
DELETE o
FROM Orders o
INNER JOIN deleted d ON o.GoodsName = d.Name;
END;
xp_cmdshell 等高危擴展存儲過程,採用 CLR 集成或外部任務隊列替代。sys.triggers、sys.procedures,清理廢棄對象。