Truncate在對大表全删除操作時,會明顯比Delete語句更快更有效,但是因為它不需要存放日志,并且一定是全表删除,是以造成資料的不可恢複性。也說明了它的危險性。
但是,執行Truncate需要有表擁有者、系統管理者、db_owner、db_ddladmin這些裡面的其中一種高權限角色才能執行。
對此,可以使用05之後的EXECUTE AS表達式來實作權限内容的切換:
1. 切換登入:EXECUTE AS LOGIN
2. 切換使用者:EXECUTE AS USER
3. 切換執行權限:EXECUTE AS owner/’user name’,利用高使用者權限來執行作業。此步驟可以在低權限實體下執行高權限操作,也能避免安全性漏洞。
另外,隻有EXECUTE AS Caller可以跨資料庫執行,而其他方式進行的權限切換僅限制于本資料庫。
注意:執行EXECUTE AS USER模拟使用者切換時,需要先獲得被模拟使用者的授權。
可以使用REVERT來還原執行内容前的原始身份。
對于DBA工作或者某些特殊的應用程式,需要擷取前端應用的系統資訊。而這些資訊如果用使用者表來存儲,代價會比直接讀取資料庫系統資訊要大。是以建議适當讀取系統表:
在連接配接資料庫的session期間,都可以在master資料庫中找到session資訊,但是從05開始,有了很多DMV/DMF來實作這些功能:
l Master.dbo.sysprocesses或者master.sys.sysprocesses:提供執行階段的SPID、計算機名、應用程式名等。
l Sys.dm_exec_sessions:記錄每個session的基本資訊,包括id、計算機名、程式名、應用程式名等
l Sys.dm_exec_connections:記錄每個連接配接到SQLServer執行個體的前端資訊,包括網絡位置、連接配接時間等等。
l select
client_net_address 'Client IP Address',local_net_address'SQL ServerIP Address',*
l from
sys.dm_exec_connections
l wheresession_id=@@spid
在2005以後,建議使用DMV取代系統表。
對于資料庫應用程式,無論是那種DBMS,SQL注入都是一大隐患。
要避免SQL注入,應該最起碼做到以下幾點:
1. 檢查輸入的資料,應用程式不要相信使用者輸入的資料,必須經過檢驗後才能輸入資料庫。要排除%、--等特殊符号。
2. 避免果度暴露錯誤資訊。建議可以轉換成Windows事件或者是轉換成應用程式内部錯誤資訊。
3. 使用參數化查詢或者存儲過程