問題: 在SQL Server Management Studio中可以運行作業但是用T-SQL運行則失敗,反之亦然. 分析: 這種情況多數為執行時上下文(Context)安全性問題。在SSMS中執行的時候,T-SQL語句是在當前登錄名下運行的。但是作業在SQL Server Agent中是以SQL Server Agen
問題:
在SQL Server Management Studio中可以運行作業但是用T-SQL運行則失敗,反之亦然.
?
分析:
這種情況多數為執行時上下文(Context)安全性問題。在SSMS中執行的時候,T-SQL語句是在當前登錄名下運行的。但是作業在SQL Server Agent中是以SQL Server Agent 服務(SQL Server Agent Service account)運行的,如果SQL Server Agent的賬號與在SSMS中執行T-SQL的賬號不一樣或者權限不同的話,作業就會失敗。
? |
本人的實踐是使用高權限的賬號來運行SQL Server Agent,并且具有獨立賬號,同時密碼不能過期,否則運行一段時間就會運行不了。但是基于“最小安全性原則”,一般不建議使用過高權限。同時,不能使用SQL Server Agent 代理來執行作業,因為T-SQL作業步驟不使用任何代理。對于T-SQL作業步驟,默認是以作業擁有者的安全上下文運行。
?
解決方法:
方法1:把作業擁有者的權限開放到足夠大,但是不要使用sysadmin。
方法2:在T-SQL作業中使用RUN AS USER提示來執行T-SQL作業。這樣不需要更改原有的權限。但是此過程確保你有足夠的權限賦予RUN AS USER。如圖:
方法3:此方法主要是腳本化方法2,在T-SQL的開頭加上:
- EXECUTE?AS?USER=’xxxx’??
- ?–上面語句賦予下面執行的腳本xxxx登錄用戶的權限。???
- ?SELECT?*?FROM?HumanResources.Department??
- ?–運行完后回收權限:???
- ?REVERT;??
最后可以通過SQLServer Profiler來監控執行作業的是什么賬號