為何將DTS包轉成作業時就會出錯?

2021-05-22 23:00:25 字數 2761 閱讀 7564

為何將dts包轉成作業時就會出錯?

dts包在何處執行?

為什麼dts包成了作業以後就不能正確執行了呢?我們從企業管理器中執行的時候一切正常,但我們把它當成乙個作業的時候就不行了。因為它執行不同的環境裡,這個環境指的是security context,安全環境或安全上下文。作為程式設計師你可以在一台工作站前執行程式,那dts所處的環境就是你面前機器的環境,但如果作為作業,它始終執行在伺服器上。

作為程式設計師,你可以希望從乙個文字檔案中匯入資料,但是dts中指定的檔案必須也存在於伺服器上,而且必須有足夠的許可權支援對這個檔案的操作。

那到底是誰執行了dts包呢?是乙個稱為sql agent的服務,這個作業有乙個擁有者,這個擁有者可以是乙個sql server登入也可以是乙個nt帳戶。可以通過企業管理器來直接檢視所有者是誰,也可以通過執行msdb.dbo.sp_help_job來獲知誰是擁有者。

對於sql server 7.0來說,安全上下文是由作業的所有者決定的。如果所有者是乙個不必於sysadmin角色的使用者,包就在sqlagentcmdexec帳戶下執行,當然使用的安全上下文也就是這個帳戶的,因此這個帳戶必須擁有足夠的許可權才能夠執行指定的操作。通常而言,sqlagentcmdexec帳戶不擁有對伺服器以外計算機的許可權,因此對別的機器上檔案的訪問當然就要失敗了。

對於sql server 2000來說,安全上下文也是作業的擁有者決定。如果所有者是乙個不必於sysadmin角色的使用者,包就在sql agent proxy帳戶下執行,也使用此使用者的許可權。對於sql agent proxy來說,它可以執行與資料庫相連的操作,當然它也必須擁有相應的資料庫和nt許可權。對於執行dts包來說,sql agent proxy account必須擁有對帳戶執行臨時目錄的讀寫許可權,這也目錄是:c:/documents and settings//local settings/temp

如果作業是被sysadmin資料庫角色的成員擁有,作業即在啟動sql agent服務的帳戶下執行。同時,如果作用被nt域使用者擁有,而且包被儲存於資料庫,你必須使用在同一域或信任域的使用者啟動sql server服務。例如,如果sql agent作業由usa域使用者所有,那啟動sql server服務的使用者必須是來自usa域或usa域的信任域。如果sql server由本地帳戶啟動,包的執行將失敗。如果排程乙個dts包,此時它的擁有者將是誰?此時的擁有者要看登入企業管理器時誰進行了登入,如果資料庫使用nt認證,作業的主將是啟動sql agent服務的nt帳戶;如果登入企業管理器的時候使用sql server認證(如利用sa登入),那主將是這個sql server使用者。如果希望改變包的擁有者,可以在企業管理中實現,直接右鍵一擊,在」通用「下面就是了。而在查詢分析器中則要使用msdb.dbo.sp_update_job來進行。

dts如果通過dtsrun.exe執行,那安全上下文就是此時登入計算機的使用者。如果通過xp_cmdshell執行如果dtsrun.exe,如果此使用者是sysadmin角色中的使用者,他啟動了sql server服務,他就是安全上下文。如果是這個使用者不是sysadmin角色中的使用者,則dtsrun.exe在sqlagentcmdexec帳戶中執行。如果sql server以本地帳戶啟動,dts包不擁有訪問其它機器資源的許可權。

如果sql server服務在nt帳戶下啟動,它的許可權和nt帳戶的許可權一致。如果此帳戶是乙個本地帳戶,dts包不擁有對其它機器的許可權;如果此帳戶是乙個域使用者,包可以訪問域內其它計算機的資源。有時在dts包中我們使用乙個nt認證連線,此連線的安全上下文與包執行的安全上下文一致。如果在命令列上執行dtsrun.exe,此進行獲得的安全證書是當前nt登入使用者的證書。如果包以乙個作業執行,此連線的安全上下文將是啟動sql agent的帳戶,我們假設包的擁有者是sysadmin的成員。

我們對映驅動器時包執行會出錯,因為對映的驅動器不是物理存在的,而sql agent是乙個nt服務,nt服務是無法看到對映驅動器的。對映是使用者指令碼的一部分,服務不會呼叫使用者指令碼的內容,請使用unc路徑來解決其它機器上資源的呼叫。相對路徑也最好不要使用,因為dts包的執行將由除錯機轉移到伺服器,因此相對路徑不好用。至於com元件的使用,一定要確定伺服器上也有相應的com元件。雖然包本身也有一些密碼要提供,如包擁有者的密碼和使用者密碼,這些東西和執行環境沒有關係。sqlagentcmdexec的許可權如果不足以執行包,會產生下面的錯誤資訊:

dtsrun: loading... dtsrun: executing... dtsrun onstart: dtsstep_dt***ecutesqltask_1 dtsrun onerror: dtsstep_dt***ecutesqltask_1, error = -2147217843 (80040e4d) error string: login failed for user 'nt_name/sqlagentcmdexec'. error source: microsoft ole db provider for sql server help file: help context: 0 error detail records: error: -2147217843 (80040e4d); provider error: 18456 (4818) error string: login failed for user 'nt_name/sqlagentcmdexec'. error source: microsoft ole db provider for sql server help file: help context: 0 dtsrun onfinish: dtsstep_dt***ecutesqltask_1 dtsrun: package execution complete. process exit code 1. the step failed.

你必須給sqlagentcmdexec足夠的登入權利和資料庫許可權。

作業中,呼叫DTS包的問題

作業中呼叫dts包的問題 問題描述1 如何使用作業排程dts包 方法 1.企業管理器 資料轉換服務 本地包 右鍵你要排程的包 選擇 排程包 設定排程時間安排即可。2.如果直接建立作業,則應該在作業的步驟型別中選擇 作業系統命令 cmdexec 在作業的 中,使用 dtsrun 來執行指定的dts包。...

作業中,呼叫DTS包的問題

作業中呼叫dts包的問題 問題描述1 如何使用作業排程dts包 方法 1.企業管理器 資料轉換服務 本地包 右鍵你要排程的包 選擇 排程包 設定排程時間安排即可。2.如果直接建立作業,則應該在作業的步驟型別中選擇 作業系統命令 cmdexec 在作業的 中,使用 dtsrun 來執行指定的dts包。...

作業中呼叫DTS包的問題

鄒建blog http blog.csdn.net zjcxc archive 2005 05 30 384522.aspx 作業中呼叫dts包的問題 問題描述1 如何使用作業排程dts包 方法 1.企業管理器 資料轉換服務 本地包 右鍵你要排程的包 選擇 排程包 設定排程時間安排即可。2.如果直接...