資料庫中的user和schema的關係

2021-07-15 03:17:07 字數 2777 閱讀 9366

在sqlserver2000中,由於架構的原因,user和schema總有一層隱含的關係,讓我們很少意識到其實user和schema是兩種完全不同的概念,不過在sqlserver2005中這種架構被打破了,user和schema也被分開了。

首先來做乙個比喻,什麼是database,schema,table,列,行,user?可以把database看作是乙個大的倉庫,倉庫分了很多很多的房間,schema就是其中的房間,乙個schema代表乙個房間,table可以看作是每個schema中的床,table(床)就被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸啊。然後床上可以放置很多物品,好比table可以放置很多列和行一樣,資料庫中儲存資料的基本單元是table,現實中每個倉庫放置物品的基本單位就是床,user就是每個schema的主人,(所以schema包含的object,而不是user),其實user是對應與資料庫的(即user是每個對應資料庫的主人),既然有運算元據庫的(倉庫)的權利,就肯定有運算元據庫中每個schema(房間)的權利,就是說每個資料庫對映的user有每個schema(房間)的鑰匙,換句話說,如果它是某個倉庫的主人,那麼這個倉庫的使用權和倉庫中的所有東西都是他的(包括房間),他有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某乙個房間,這個現實中的相似,我還可以給user分配具體的許可權,也就是他到某一房間能做些什麼,是只能看(read-only),還是可以像主人一樣有所有的控制權(r/w),這個就要看這個user所對應的角色role了。

在sqlserver2000中,假如我們在某一資料庫中建立了使用者bosco,那麼此時後台也為我們預設的建立了schema【bosco】,schema的名字和user的名字相同,這也是我們分不清使用者和schema的原因。

在sqlserver2005中,為了向後相容,當你用sp_adduser儲存過程建立乙個使用者的時候,sqlserver2005同時也建立了乙個和使用者名稱相同的schema,然而這個儲存過程是為了向後相容才保留的,我們應該逐漸熟悉用新的ddl語言create user和create schema來運算元據庫,在sqlserver2005中,當我們用create user建立資料庫使用者時,我們可以用該使用者指定乙個已經存在的schema作為預設的schema,如果我們不指定,則該使用者所預設的schema即為dbo schema,dbo房間(schema)好比乙個大的公共房間,在當前登入使用者沒有預設schema的前提下,如果你在大倉庫中進行一些操作,比如create table,如果沒有制定特定的房間(schema),那麼你的物品就只好放進公共的dbo房間(schema)了。但是如果當前登入使用者有預設的schema,那麼所做的一切操作都是在預設的schema上進行(比如當前登入使用者為login1,該使用者的預設schema為login1,那麼所做的所以操作都是在這個login1預設schema上進行的。實驗已經證明的確如此)。估計此時你會有一點暈,剛才說dbo是乙個schema,但是你可以在資料庫中檢視到,dbo同事也是乙個user,暈了吧。

在sqlserver2005中建立乙個資料庫的時候,會有一些schema包括進去,被包括進去的schema有:dbo,information_schema,guest,sys等等(還有一些角色schema)。

在上文中已經提到了,在sqlserver2005中當用儲存過程sp_adduser建立乙個user時,同時sqlserver2005也為我們建立了乙個預設的和使用者名稱相同的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的關係

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

資料庫中User和Schema的關係

就是床,user就是每個schema的主人,所以schema包含的是object,而不是user 其實user是對應與資料庫的 即user是每個對應資料庫的主人 既然有運算元據庫 倉庫 的權利,就肯定有運算元據庫中每個schema 房間 的權利,就是說每個資料庫對映的user有每個schema 房間...

資料庫中User和Schema的關係

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