(一)資料庫系統登入:註冊在:安全性-->登入 下的使用者,這邊的使用者是用來定義可登入此台 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!Go
sp_change_users_login 'update_one', 'DBuser', 'PowerUser'
完成設定後,可以從個別資料庫(如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
額外備註:
資料庫的元素(或稱元件或部件或物件)會以多對多方式隷屬於某一個 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
感謝,靠你這篇解了我的問題!
回覆刪除我的情形是要把原先的資料庫備份,但是還原到另一個剛重灌的SQL Server。
因為原先的個別資料庫就已經對應到原先的「使用者」'user'了,我在新的server創「登入」'user'(配合程式不能改名)時,SQL Server不讓我在「使用者對應」勾選原先的資料庫,說已經重複了(SQL Error 15023)。但是不對應,執行自己的程式時又會權限不足(SQL Error 916)。
指令跟你提供的類似:
Use 個別DB名稱
Go
sp_change_users_login 'update_one', 'user', 'user'
能幫上忙,我也很高興,其實我的博文只是為自己解決過的問題留下紀錄,謝謝你讓我感受到寫博文的另—層價值
刪除