深入講解資料庫中User和Schema的關係

2021-05-02 10:37:49 字數 4961 閱讀 8335

深入講解資料庫中userschema的關係

user

和schema

究竟是什麼關係,首先必須了解一下資料庫中

user

和schema

到底是什麼概念。 在

sql server2000

中,由於架構的原因,

user

和schema

總有一層隱含的關係,讓我們很少意識到其實

user

和schema

是兩種完全不同的概念,不過在

sql server2005

中這種架構被打破了,

user

和schema

也被分開了。

首先我來做乙個比喻,什麼是

database

,什麼是

schema

,什麼是

table

,什麼是列,什麼是行,什麼是

user

?我們可以可以把

database

看作是乙個大倉庫,倉庫分了很多很多的房間,

schema

就是其中的房間,乙個

schema

代表乙個房間,

table

可以看作是每個

schema

中的床,

table

(床)就被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了

j。,然後床上可以放置很多物品,就好比

table

上可以放置很多列和行一樣,資料庫中儲存資料的基本單元是

table

,現實中每個倉庫放置物品的基本單位就是床,

user

就是每個

schema

的主人,(所以

schema

包含的是

object

,而不是

user

),其實

user

是對應與資料庫的(即

user

是每個對應資料庫的主人),既然有運算元據庫(倉庫)的權利,就肯定有運算元據庫中每個

schema

(房間)的權利,就是說每個資料庫對映的

user

有每個schema

(房間)的鑰匙,換句話說,如果他是某個倉庫的主人,那麼這個倉庫的使用權和倉庫中的所有東西都是他的(包括房間),他有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某乙個房間,呵呵,和現實也太相似了吧。我還可以給

user

分配具體的許可權,也就是他到某乙個房間能做些什麼,是只能看(

read-only

),還是可以像主人一樣有所有的控制權(

r/w),這個就要看這個

user

所對應的角色

role

了,至於分配許可權的問題,我留在以後單獨的

blog

中詳述。比喻到這裡,相信大家都清楚了吧。 在

sql server2000

中,假如我們在某乙個資料庫中建立了使用者

bosco

,按麼此時後台也為我們預設地建立了預設

schema

【bosco

】。schema

的名字和

user

的名字相同,這也是我們分不清楚使用者和

schema

的原因。 在

sql server2005

中,為了向後相容,當你用

sp_adduser

儲存過程建立乙個使用者的時候,

sql server2005

同時也建立了乙個和使用者名稱相同的

schema

,然而這個儲存過程是為了向後相容才保留的,我們應該逐漸熟悉用新的

ddl語言

create user

和create schema

來運算元據庫。在

sql server2005

中,當我們用

create user

建立資料庫使用者時,我們可以為該使用者指定乙個已經存在的

schema

作為預設

schema

,如果我們不指定,則該使用者所預設的

schema

即為dbo schema

,dbo

房間(schema

)好比乙個大的公共房間,在當前登入使用者沒有預設

schema

的前提下,如果你在大倉庫中進行一些操作,比如

create tabe

,如果沒有指定特定的房間(

schema

),那麼你的物品就只好放進公共的

dbo房間(

schema

)了。但是如果當前登入使用者有預設的

schema

,那麼所做的一切操作都是在預設

schema

上進行(比如當前登入使用者為

login1

,該使用者的預設

schema

為login1

,那麼所做的所有操作都是在這個

login1

預設schema

上進行的。實驗已經證明的確如此)。估計此時你會有一點暈,為什麼呢?我剛才說

dbo是乙個

schema

,但是你可以在資料庫中檢視到,

dbo同時也是乙個

user

,暈了吧,呵呵。 在

sql server2005

中建立乙個資料庫的時候,會有一些

schema

包括進去,被包括進去的

schema

有:dbo

,information_schema, guest

,sys

等等(還有一些角色

schema

,不提了,有暈了)。

我在上文中已經提到了,在

sql server2005

中當用儲存過程

sp_adduser

建立乙個

user

時,同時

sql server2005

也為我們建立了乙個預設的和使用者名稱相同的

schema

,這個時候問題出來了,當我們

create table a

時,如果沒有特定的

schema

做字首,這個

a表建立在了哪個

schema

上,即進入了哪個房間?答案是: 1.

如果當前運算元據庫的使用者(可以用

select current_user

查出來)有預設的

schema

(在建立使用者的時候指定了),那麼表

a被建立在了預設的

schema上。

2.如果當前運算元據庫的使用者沒有預設的

schema

(即在建立

user

的時候預設為空),但是有乙個和使用者名稱同名的

schema

,那麼表

a照樣被建立在了

dbo schema

上,即使有乙個和使用者名稱同名的

schema

存在,由於它不是該使用者預設的

schema

,所以建立表的時候是不會考慮的,當作一般的

schema

來處理,別看名字相同,可是沒有任何關係哦。 3.

如果在建立表

a的時候指定了特定的

schema

做字首,則表

a被建立在了指定的

schema

上(有許可權嗎?)

現在問題又出來了,在當前運算元據庫的使用者(用

select current_user

可以檢視到,再次強調)沒有預設

schema

的前提下,當我們用

create table a

語句時,

a表會去尋找

dbo schema

,並試圖建立在

dbo schema

上,但是如果建立

a表的使用者只有對

dbo schema

的唯讀許可權,而沒有寫的許可權呢?這個時候

a表既不是建立不成功,這個就是我以後會提及到的

login,user, role

和schema

四者之間的關係。在這裡,為了避免混淆和提高運算元據庫的速度(在少量資料範圍內,對我們肉眼來說幾乎看不到差異),我們最好每次在運算元據庫物件的時候都顯式地指定特定的

schema

最為字首。

現在如果登入的使用者為

sue,該使用者有乙個預設

schema

也為sue

,那麼如果現在有一條查詢語句為

select * from mytable,

那麼搜尋每個房間(

schema

)的順序是怎樣的呢?順序如下:

1. 首先搜尋

sys.mytable

(sys schema)

2. 然後搜尋

sue.mytable (default schema)

3. 最後搜尋

dbo.mytable (dbo schema)

執行的順序大家既然清楚了,那麼以後在查詢資料庫表中的資料時,最好指定特定的

schema

字首,這樣子,資料庫就不用去掃瞄

sys schema

了,當然可以提高查詢的速度了。

另外需要提示一下的是,每個資料庫在建立後,有4個

schema

是必須的(刪都刪不掉),這4個

schema

為:dbo

,guest

,sys

和information_schema

,其餘的

schema

都可以刪除。

深入講解資料庫中User和Schema的關係

究竟是什麼關係,首先必須了解一下資料庫中user和schema到底是什麼概念。在sql server2000中,由於架構的原因,user和schema總有一層隱含的關係,讓我們很少意識到其實user和schema是兩種完全不同的概念,不過在sql server2005中這種架構被打破了,user和s...

深入講解資料庫中User和Schema的關係

在sql server2000中,由於架構的原因,user和schema總有一層隱含的關係,讓我們很少意識到其實user和schema是兩種完全不同的概念,不過在sql server2005中這種架構被打破了,user和schema也被分開了。首先我來做乙個比喻,什麼是database,什麼是sch...

深入講解資料庫系統安全中的「漏洞發掘」

如今,在病毒肆虐 黑客無處不在的網路環境裡,軟體的安全性已成為乙個備受關注的話題。傳統的軟體安全性關注的主要在於許可權與角色的管理,如訪問控制,或是資料的機密性與完整性,如加密解密。但是乙個軟體系統在應用了這些安全措施之後就能確保其萬無一失了嗎?答案似乎並不那麼簡單,其中乙個重要 甚至可以說致命 的...