問題:
在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的開頭加上:
[sql] view plaincopyprint?
- EXECUTE AS USER='xxxx'
- --上面語句賦予下面執行的指令碼xxxx登入使用者的許可權。
- SELECT * FROM HumanResources.Department
- --運行完後回收許可權:
- REVERT;
EXECUTE AS USER='xxxx' --上面語句賦予下面執行的指令碼xxxx登入使用者的許可權。 SELECT * FROM HumanResources.Department --運行完後回收許可權: REVERT;
最後可以通過SQLServer Profiler來監控執行作業的是什麼帳號