2012年9月25日 星期二

SQL 2005 錯誤 15023

MS SQL 資料庫系統的使用者有兩種身份:
(一)資料庫系統登入:註冊在:安全性-->登入  下的使用者,這邊的使用者是用來定義可登入此台 DB 個體(DB Instance 或指 DB Server)  的帳號,可登入,但不一定有 DB 的使用權!
(二)資料庫使用者:定義在 資料庫-->(個別資料庫)-->安全性-->使用者,這裡定義可以存取此資料庫的使用者



兩者的關係:
一般在建立使用者時即可指定兩者的對應,如果使用者建立後,才發現無法利用 Management Studio 調整對應(出現 錯誤:15023)可以利用下面的 Script 調整!

如果在(一)中沒有定義,則使用者無法登錄系統,如果在(二)中沒有定義,就不能存取此 DB,一般在設定上都會將 (一) 跟 (二)的使用者設成一樣(偷賴),但其實是可以透過對應方式 使用不同名稱,例如:
在 (一)設定名稱 為  PowerUser ,在(二)中設定名稱為  DBuser,然後利用:
Use MyDb
Go
sp_change_users_login 'update_one', 'DBuser', 'PowerUser'
將資料庫(MyDb)的使用者 DBuser 對應到 系統登入的使用者 PowerUser ,也就是說 PowerUser 登入系統後,對於 MyDb 的存取權限就相當於 DBuser!

完成設定後,可以從個別資料庫(如MyDb)的使用者屬性中看到:
使用者名稱:DBuser     (即在 MyDb 中的使用者)
登入名稱:PowerUser  (即系統登入的使用者)

(資料結構描述 ==  Data Schema)
額外備註:
資料庫的元素(或稱元件或部件或物件)會以多對多方式隷屬於某一個 Schema (例如:dbo),所以存取資料庫元素時,完整的寫法是:
伺服器名稱.資料庫名稱.結構描述名稱.物件名稱

如果在建立使用者時沒有指名使用哪一個Schema(結構描述)時,預設是 dbo,當然管理員也可以另外建立 Schema

USE MyDb
GO

CREATE SCHEMA mydbo AUTHORIZATION user
--對 MyDb建立一個 結構描述,名稱為 mydbo,並將它指定給 user (user 為 mydbo的所有人)

ALTER SCHEMA mydbo TRANSFER MyDb.myTable
--將 MyDb 的資料表 myTable 指定給 mydbo

ALTER AUTHORIZATION ON SCHEMA::mydbo TO User2
--將mydbo結構描述指定給 User2

2 則留言:

  1. 感謝,靠你這篇解了我的問題!

    我的情形是要把原先的資料庫備份,但是還原到另一個剛重灌的SQL Server。
    因為原先的個別資料庫就已經對應到原先的「使用者」'user'了,我在新的server創「登入」'user'(配合程式不能改名)時,SQL Server不讓我在「使用者對應」勾選原先的資料庫,說已經重複了(SQL Error 15023)。但是不對應,執行自己的程式時又會權限不足(SQL Error 916)。

    指令跟你提供的類似:
    Use 個別DB名稱
    Go
    sp_change_users_login 'update_one', 'user', 'user'

    回覆刪除
    回覆
    1. 能幫上忙,我也很高興,其實我的博文只是為自己解決過的問題留下紀錄,謝謝你讓我感受到寫博文的另—層價值

      刪除