2009年10月9日 星期五

DTS的owner與owner_sid不一致的問題

最近同事反應SQL 2000的某個DTS無法儲存,會出現"Only the owner of DTS Package or a member of the sysadmin role may create new versions of it."的錯誤,意思就是只有此DTS的擁有者或是系統管理員的身分才能建立新的版本,目前那個DTS的owner不是他,那我改掉應該就行

上網查了一下發現可以用sp_reassign_dtspackageowner [@name =] 'name',[@id =] 'id',[@newloginname =] 'newloginname'來改變DTS的owner

我先請他自己建一個DTS看看顯示的owner是誰,owner是個網域帳號,我就以為我也應該把那個DTS的owner改成那個網域帳號,因為一直以來我發現雖然是用SQL帳號登入的,可是儲存後顯示卻都是網域帳號,我覺得這樣很正常,不過結果改了後還是不能儲存,錯誤依舊一樣

想說怪了,怎麼還是不行,我不死心,上網查了一些資料,有了一點線索,查看sysdtspackages會發現有owner與owner_sid這兩個欄位,owner明明已經是那個網域帳號啦,那可能問題出在owner_sid囉,會不會實際上儲存時是比對owner_sid而不是owner?
再查看sp_reassign_dtspackageowner 這個StoredProcedure的內容

UPDATE sysdtspackages SET owner_sid =
SUSER_SID(@newloginname), owner =
@newloginname WHERE id = @id
owner與owner_sid都更新一致,那這個也沒問題

再查看sp_add_dtspackage 這個StoredProcedure的內容,發現儲存到sysdtspackages時,owner_sid與owner可能會不一致喔,而且真的是比對owner_sid,而不是owner,所以我看owner是不完全正確的,那問題很清楚啦

我再重新整理一下,因為環境有加入AD,SQL server上的User群組有加入Domain users,然後我同事平常是用SQL帳號連接的server的,假設是test,然後他登入AD用的是Domain\adalf好了,當他加入個DTS時,sp_add_dtspackage 會寫入一筆資料到sysdtspackages,其中owner是寫Domain\adalf,可是owner_sid卻是test的sid,這應該是有問題的,但是當下次要修改儲存時,會先比對owner_sid與目前使用的SUSER_SID(),都是test的sid,所以可以正常儲存

但若我們看的是owner有可能會被誤導,以為同事的owner是Domain\adalf,把另一個DTS的owner改成Domain\adalf,以方便我同事修改,當我們一但用sp_reassign_dtspackageowner 改掉後,owner_sid與owner都是一致的,也就是Domain\adalf,這是正確的,可是我們下次儲存DTS的時候,會判斷DTS的owner_sid與目前使用的SUSER_SID()是否相同,結果owner_sid是Domain\adalf的sid,可是SUSER_SID()卻是test的,所以我同事就不能儲存囉,所以用sp_reassign_dtspackageowner把DTS的owner改成test就沒問題了

0 意見:

張貼留言