數據庫:SqlServer用戶名和登錄名的關系總結
鏈接或登錄Sql Server服務器時是用的登錄名而非用戶名登錄的,程序里面的鏈接字符串中的用戶名也是指登錄名。
SQLSERVER中有幾個特殊的登錄名和用戶名:
我們常見的dbo(用戶名)是指以sa(登錄名)或windows administration(Windows集成驗證登錄方式)登錄的用戶,也就是說數據庫管理員在SQLSERVER中的用戶名就叫dbo,而不叫 sa,這一點看起來有點蹊蹺,因為通常用戶名與登錄名相同(不是強制相同,但為了一目了然通常都在創(chuàng)建用戶名時使用與登錄名相同的名字),例如創(chuàng)建了一個登錄名稱為me,那么可以為該登錄名me在指定的數據庫中添加一個同名用戶,使登錄名me能夠訪問該數據庫中的數據.當在數據庫中添加了一個用戶me 后,之后以me登錄名登錄時在該數據庫中創(chuàng)建的一切對象(表,函數,存儲過程等)的所有者都為me,如me.table1,me.fn_test(),而不是dbo.table1,dbo.fn_test().
SQL Server中還有一個特殊的數據庫角色public,它存在于每一個數據庫中,包括系統數據庫,如master、msdb、model和用戶數據庫,數據庫的所有用戶都屬于public角色,并且不能從public角色中刪除。
在SQLSERVER數據庫中,guest帳戶是特殊的用戶帳戶。如果用戶使用USE database語句訪問的數據庫中沒有與此用戶關聯的帳戶,此用戶就與guest用戶相關聯。
另外SQLSERVER采取登錄名-用戶名的安全規(guī)則,和Oracle里面的schema有點像。SQLSERVER使用所有者進行限定(類似于Oracle中的schema),是因為不同的用戶可能創(chuàng)建同名的對象,例如登錄名me和登錄名you在pubs數據庫中分別創(chuàng)建了用戶名me和you,這二個用戶都創(chuàng)建了testtable這個同名表,而這二個表雖然同名但結構或數據可能完全不同,為了避免調用錯誤,必須使用所有者名稱進行限定.
如何來調用別的用戶創(chuàng)建的對象呢?例如me用戶訪問you用戶創(chuàng)建的表或訪問dbo創(chuàng)建的表. 此種情況,必須同時滿足二個條件:
1.將me用戶的數據庫角色設置為db_owner,否則無法訪問其他用戶(包括dbo用戶)創(chuàng)建的對象.(企業(yè)管理器-> 用戶,右鍵菜單 <屬性> 中設置) :
2.使用所有者進行限定.
例如me訪問you創(chuàng)建的testtable:
select * from you.testtable
另外,dbo用戶作為管理員,系統賦予其所有的權限,可以調用任何用戶創(chuàng)建的對象.
若某個數據庫存在2個或2個以上的用戶名,如果具有db_owner角色的用戶在訪問對象時省略了所有者,則系統先查找該用戶的對象,若找不到則查找dbo用戶是否有同名對象.例如:
select * from testtable 或
select * from pubs..testtable
實驗:
創(chuàng)建登錄名login_ibrahim
用此登錄名登錄“查詢分析器”,發(fā)現只能查看系統自帶的數據庫,如master、Northwind、pubs等
將登錄名login_ibrahim的服務器角色設置為Database Creator(若不設置此項,則無法創(chuàng)建數據庫)
在“查詢分析器”中輸入create database test,然后執(zhí)行,這會創(chuàng)建一個名為test的數據庫
查看test數據庫擁有的用戶名,發(fā)現系統會自動創(chuàng)建了dbo和guest這兩個用戶名。其中dbo用戶名對應的登錄名為login_ibrahim,不能更改test數據庫登錄名login_ibrahim所對應的用戶名dbo,此時test數據庫的dbo用戶名,其對應的登錄名有兩個,一個是login_ibrahim,另一個是sa(沒想到吧^_^,因為sysadmin 固定服務器角色的成員會自動映射到 dbo。)
創(chuàng)建登錄名login_ibrahim2,不設置任何服務器角色,將可訪問數據庫設置為test
打開test數據庫的用戶名列表,會發(fā)現系統會為登錄名login_ibrahim2自動創(chuàng)建一個同名的用戶名login_ibrahim2,然后再創(chuàng)建一個名為T_ibrahim的數據表
此時用login_ibrahim2登錄SQLSERVER,發(fā)現不能在test數據庫中創(chuàng)建表
用login_ibrahim登錄SQLSERVER,為login_ibrahim2用戶名授予對test數據的db_ddladmin權限
此時用login_ibrahim2登錄SQLSERVER,發(fā)現可以創(chuàng)建數據表(創(chuàng)建名為T_ibrahim的數據表),并插入數據!