Sql Server2008之關於”***物件無效“錯誤
我們在sql server2008中編寫sql語言時,經常會遇到這樣的提示:***物件無效。這是什麼錯誤,為什麼在2000版本中就不存在這樣的情況呢?其實這主要是sql server 2005/2008版本中新增了架構的概念。下面就結合網上的查詢說一下我對sql server2008中架構的理解。可能有一些東西理解的不到位,歡迎各位指出,共同學習、改進。
1、定義
首先,我們來看一下微軟對架構的官方定義:架構(Schema)是形成單個名稱空間的資料庫實體的集合。名稱空間是一個集合,其中每個元素的名稱都是唯一的。個人感覺這個定義有點晦澀,我理解的架構就是資料庫中用來存放表(資料庫物件)的名稱空間。資料庫這個大的名稱空間下可以包括多個架構(小的名稱空間),每個架構下又可以包含多張表。
架構實際上早在SQL SERVER 2000中就已經存在,不過在SQL SERVER 2000中資料庫使用者和架構是隱式連線在一起的,,每個資料庫使用者都是與該使用者同名的架構的所有者。當我們使用查詢分析器去查詢一個表的時候,一個完整的表的名稱應該包括伺服器名.資料庫名.使用者名稱.物件名,而在SQL SERVER 2005/2008中一個表的完全限定名稱應該為伺服器名.資料庫名.架構名.物件名。在SQL SERVER 2000中的完全限定名稱中的“使用者名稱”也是資料庫中的使用者,也是“架構名”。假如有一個賬戶df在test資料庫中建立了一張表tb1的時候,在查詢分析器中應該輸入的查詢語句為select * from test.df.tb1,也就是說,在SQL SERVER 2000中一張表所屬的架構預設就是表的建立者的登入名稱,使用者可以修改他所建立的所有資料庫物件。但在2008中已經將使用者和其建立物件所屬關聯取消了,而加入了一個全新的架構體系。
2、引入
那微軟為何要在05之後的版本中引入架構,並將使用者與架構分開呢?將架構與資料庫使用者分離對管理員和開發人員而言有什麼好處呢?
1.架構管理與使用者管理分開。多個使用者可以通過角色(role)或組(Windows groups)成員關係擁有同一個架構。在SQL SERVER 2005/2008 中,每個資料庫角色都有一個屬於自己的架構,如果我們建立一個表,給它指定的架構名稱為 db_ddladmin,那麼任何一個屬於db_ddladmin中的使用者都是可以去查詢、修改和刪除屬於這個架構中的表,但是不屬於這個組的使用者是沒有對這個架構中的表進行操作的許可權,有一點必須注意,db_dbdatareader組的成員可以檢視所有資料庫中的表,db_dbdatawriter組成員可以修改所有資料庫中 的表,db_owner組成員可以對資料庫所有表進行所有操作,這幾個組的成員可以通過角色獲取到在資料庫中的特殊許可權。
2.在建立資料庫使用者時,可以指定該使用者賬號所屬的預設架構。 ( 建議大家指定)
3. 刪除資料庫使用者變得極為簡單。在 SQL Server 2000 中,使用者(User)和架構是隱含關聯的,即每個使用者擁有與其同名的架構。因此要刪除一個使用者,必須先刪除或修改這個使用者所擁有的所有資料庫物件,就比如 一個員工要離職要刪除他的賬戶的時候,還得將他所建立的表和檢視等都刪除,影響過大。SQL SERVER 2005/2008將架構和物件者分離後就不在存在這樣的問題,刪除使用者的時候不需要重新命名該使用者架構所包含的物件,在刪除建立架構所含物件的使用者後,不再需要修改和測試顯式引用這些物件的應用程式。
4. 共享預設架構使得開發人員可以為特定的應用程式建立特定的架構來存放物件,這比僅使用管理員架構(DBO schema)要好。
5. 在架構和架構所包含的物件上設定許可權(permissions)比以前的版本擁有更高的可管理性。
6. 區分不同業務處理需要的物件,例如,我們可以把公共的表設定成pub的架構,把銷售相關的設定為sales,這樣管理和訪問起來更容易。大多數使用者在建立物件的時候習慣直接輸入物件名而將物件的架構名稱省略,在2005/2008 中,會給使用者建立的這樣的表加上一個預設的架構,使用者如果沒有對自己的默 認架構做設定,那預設架構就是dbo,也就是說,如果一個db_ddladmin的成員在資料庫中建立一個沒有加上架構名稱的表,這個表在資料庫中的完整 名稱應該是dbo.表名,建立者在資料庫中如果不是屬於其它特殊組的成員,是不能對特殊組成員建立的表進行任何修改和查詢的。
7.若不指定預設架構,則為DBO,為了向前相容,早期版本中的物件遷移到新版本中,早期版本中沒有架構的概念的。所以就該物件的架構名就是dbo.在SQL Server 2008中,DBO就是一個架構
8.當查詢物件時,先找與使用者預設架構相同的架構下的物件,找不到再找DBO的物件
3、架構的作用
使用者與架構分開,可以讓資料庫內各物件不再綁在某個使用者賬號上,可以解決SQL SERVER 2000及以前版本中”使用者離開公司“問題,也就是在擁有該物件的使用者離開公司,或離開該職務時,不必要大費周章地更改該使用者所有的物件屬於新的使用者所有。另外,也可在安裝某個套裝軟體時,設定該套裝軟體所用的資料庫物件都屬於某個特定的架構,容易區別。也就是說,在單一資料庫內,不同部門或目的的物件,可以通過架構區分不同的物件命名原則與許可權。
在SQLServer2005/2008中,架構獨立於建立它們的資料庫使用者而存在。可以在不更改架構名稱的情況下轉讓架構的所有權。並且可以在架構中建立具有使用者友好名稱的物件,明確指示物件的功能。例如,除了cus.app.entry.customEntry外,您還可以建立名為cus.app.manifest.customEntry的架構。因為“manifest”不是使用者,所以從資料庫中刪除使用者後,無需更改此名稱。這就簡化了資料庫管理員和開發人員的工作。
SQL Server 2005/2008 還引入了“預設架構”的概念,用於解析未使用其完全限定名稱引用的物件的名稱。在 SQL Server 2000 中,首先檢查的是呼叫資料庫使用者所擁有的架構,然後是 DBO 擁有的架構。在 SQL Server 2005 /2008中,每個使用者都有一個預設架構,用於指定伺服器在解析物件的名稱時將要搜尋的第一個架構。可以使用 CREATE USER 和 ALTER USER 的 DEFAULT_SCHEMA 選項設定和更改預設架構。如果未定義 DEFAULT_SCHEMA,則資料庫使用者將把 DBO 作為其預設架構。 下面舉個具體的示例來說明以一下架構的作用。
4、例項
--命令對架構進行操作
use master
go
setuser
go
--建立測試資料庫
create database schTest
go
create login df with password='sj1234',default_database=schTest
create login xhl with password='sj1245',default_database=schTest
go
use schTest
go
-- 建立兩個使用者時沒有指定屬於哪個架構
create user df for login df
create user xhl for login xhl
-- 這個表沒指定屬於哪個架構屬於預設DBO 架構
go
create table tb1 (姓名 varchar(8),性別 char(2))
--這個表就屬於sch架構
go
create schema sch
go
create table sch.tb2(姓名 varchar(8),性別 char(2),年齡 int)
-- 賦予df這個使用者查詢sch架構中的物件的許可權.
go
grant select on schema::sch to df
go
setuser 'df' --切換使用者df
select * from tb2
-- 此時報告"物件名無效" 因為tb2此時為預設的DBO架構,而實際上tb2屬於sch架構.
--帶上架構名稱,就可以查詢了
go
select * from sch.tb2
go
setuser -- 切換到sa
---切換到xhl
setuser 'xhl'
--不能查詢,是因為沒有許可權
select * from sch.tb2
go
setuser --切換sa
--給df使用者賦預設架構
alter user df with default_schema=sch
go
setuser 'df' --切換df
-- 此時不需要指定sch 也可以了,如果架構中還有其他物件,也可以查詢
select * from tb2
go
setuser --切換sa
--建立第三張測試表,同樣的是sch架構下
create table sch.tb3 (id int,uname varchar(8))
go
--切換使用者df
setuser 'df'
---可以進行查詢
select * from tb3
go
---但是無法進行資料插入,因為沒有插入許可權
insert into tb3 values (1,'abcde') --拒絕了insert許可權
go
setuser
--賦插入許可權
grant insert on schema::sch to df
--切換使用者df
setuser 'df'
go
---可以進行資料插入
insert into tb3 values (1,'abcde') --OK!
---查詢結果
select * from tb3
GO
Grant alter on schema::sch to df -- 使df 這個使用者對架構中的資料物件有可更改的能力。
--錯誤
--無法對sa、dbo、實體所有者、information_schema、sys 或您自己授予、拒絕或撤消許可權。
GO
Use master
go
Grant control server to df -- 使df這個使用者能夠控制伺服器。
--錯誤
--無法對sa、dbo、實體所有者、information_schema、sys 或您自己授予、拒絕或撤消許可權。
setuser
go
use schtest
go
--建立架構sch1
create schema sch1
go
-- 修改物件的架構tb2表的架構由sch 轉移到sch1
alter schema sch1 transfer sch.tb2
go
--建立一個新使用者,同時指定預設schema,預設屬於DBO
create login yhy with password='sj1234',default_database=master
GO
use schTest
GO
create user yhy for login yhy with default_schema=sch --屬於sch
--切換使用者yhy
setuser 'yhy'
--查詢表,物件名'tb2' 無效。
select * from tb2
go
setuser
--賦架構許可權
grant select on schema::sch1 to yhy
--切換使用者yhy
setuser 'yhy'
go
select * from tb2 ---還是無效,因為不在同一個schema
go
setuser
go
alter user yhy with default_schema=sch1 --更改yhy的預設架構
GO
--由於yhy不是當前使用者,所以無法進行查詢
select * from tb2
--顯示當前使用者
GO
select user
GO
--切換使用者yhy
setuser 'yhy'
-- 此時就可以進行查詢了,如果架構中還有其他物件,也可以查詢
go
select * from tb2
--顯示當前使用者
select user
go
setuser
go
use master
go
---刪除使用者
drop user df
drop user xhl
drop user yhy
---刪除登入名
drop login df
drop login yhy
drop login xhl
--刪除資料庫
drop database schTest
參考:
相關推薦
Sql Server2008之關於”***物件無效“錯誤
我們在sql server2008中編寫sql語言時,經常會遇到這樣的提示:***物件無效。這是什麼錯誤,為什麼在2000版本中就不存在這樣的情況呢?其實這主要是sql server 2005/2008版本中新增了架構的概念。下面就結合網上的查詢說一下我對sql serve
sql 在sqlplus下能正確執行,但是hibernate 原生sql執行報列名無效錯誤
這是我原來的sql: String sql="select s.* from(select t.*,rownum n from (select id,msg_Title,msg_Sdate from Sys_Msg where status=? and msg_sdate&
sql server2008 使用者登入失敗 錯誤18457 解決
如何新增登入使用者可以參考:http://jingyan.baidu.com/article/b2c186c8f5ea19c46ef6ffbd.html 1. 右擊企業管理器 ,選擇屬性 2.在安全性中,將伺服器身份驗證修改為 SQL Server 和Windows身份
Sql Server2008 中的活動監視器、物件資源管理器詳細資訊、搜尋、查詢編輯器之IntelliSense (轉)
Management Studio首次出現在MSSQL2005中,到MSSQL2008中已經成為了一個更成功的產品。其中在SSMS2008中最重要的特性如下: 1.活動監視器 2.物件資源管理器詳細資訊 3.搜尋 4.查詢編輯器之IntelliSense &nb
SQLServer錯誤:過程 sp_addextendedproperty,第 xxx 行物件無效。'dbo.xxx.xxx' 不允許有擴充套件屬性,或物件不存在。
示例: EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N't
mybatis免sql外掛之JpaMapper-以Jpa hibernate的風格寫mybatis(主鍵賦值策略及useGeneratedKeys無效的坑)
mybatis免sql外掛之JpaMapper-以Jpa hibernate的風格寫mybatis(主鍵賦值策略及useGeneratedKeys無效的坑) 簡介 JpaMapper以Jpa hibernate的風格寫mybatis的程式碼,可以減少手動寫sql的煩惱。 優勢:
SQL Server2008 18456錯誤
1、以windows驗證模式進入資料庫管理器。 第二步:右擊sa,選擇屬性: 在常規選項卡中,重新填寫密碼和確認密碼(改成個好記的)。把強制實施密碼策略去掉。 第三步:點選狀態選項卡:勾選授予和啟用。然後確定 第四步:右擊例項名稱(就是下圖畫紅線的
win10安裝sql server2008遇到 無法安裝.net 3.5 錯誤
如圖所示,多次安裝無效。用映象安裝 Dism /online /enable-feature /featurename:NetFX3 /All /Source:H:\sources\sxs /LimitAccess 也無效,出現錯誤為錯誤: 0x8000ffff 這些錯
SQL SERVER2008 系統啟動錯誤 3417 解決方案
很長時間沒有使用SQL SERVER2008,近日使用時才發現服務無論如何也不能啟動,提示我是“3417”錯誤!於是到只好問問度娘了。結果網上告知如下: 解決辦法一: C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\D
SQL Server2008連線錯誤'233',幫你解決
連線SQL Server2008時出現錯誤提示:已經成功與伺服器建立連線,但是在登入過程中發生錯誤。(Provider:命名管道提供程式,error:0-管道的另一端上無任何過程。)(Microsoft SQL Server,錯誤:233)。 <pre style=
xmldocument物件用save方法時出現"代理項對無效"錯誤
我用的資料庫是postgresql 其中有一個表如下:CREATE TABLE pub_data_ip( beginip numeric(19) NOT NULL, endip numeric(19), countryname character varying(80
Hibernate+SQL Server2008 時間錯誤
實體欄位定義型別是java.util.Date,使用Hibernate自動建立資料庫欄位時生成的欄位型別是datetime2,儲存日期時資料庫資料正常,見下圖 但是通過Hibernate查詢出來的資料都是比資料庫實際資料晚兩天 查詢得知datetime2是SQL S
Word 圖片無法顯示,出現對話方塊:錯誤,嵌入物件無效的解決辦法
貼上到word中的圖片或插入Word中的圖片,突然無法顯示,說是“錯誤,嵌入物件無效”,前一段時間剛剛整理好的資料,當時還能用,我還列印了出來。現在有圖片的地方卻出現的是一個醒目的大紅叉。列印預覽也無法顯示,從其他地方複製貼上過來的圖片也是無法顯示,以前這種功能在word中是能應用的。更奇怪的是同樣的
SQL SEVER select物件名無效
SQL sever 2012中,如果使用SELECT語句提示物件名無效,說明系統沒有找到你的表。這時從工具欄的新建查詢啟動查詢功能然後在可用資料庫中選出你要查詢的表的所在資料庫這時在使用SELECT語句就可以使用了如果還用問題可以在查詢的開頭使用USE DATABASE(你所
SQL Server2008建立使用者時,出現錯誤,解決辦法
在Windows2003或更高版本中.SQL Server2008可以使用Windows的密碼策略..新密碼必須符合以下原則密碼不得包含全部或部分使用者賬戶名.密碼長度至少為8個字元.密碼包含大寫字母,小寫字母,數字,非字母數字.最長為128個字元可以通過如下設定..執行-
sql server2008 插入行時報錯:單元格的值無效
在sql server2008中想插入學生資訊表中的一條記錄,但是總是不成功,提示如下: 開始我一直以為是資料型別不一致的問題,於是檢查一好多遍T_UserInfo表的第七個屬性也就是department屬性,始終沒有發現什麼。後來上網上查的時候,發現也有很多人遇到類似的問
SQL Server2008無法連線到XX,在與 SQL Server 建立連線時出現與網路相關的或特定於例項的錯誤
最近在做個人機房收費系統的時候,需要經常與SQLServer 打交道,今早在學習了兩個小時英語之後習慣性地開啟SQL Server準備做機房收費系統,但未能如願以償,出現了“無法連線到xx,在與 SQL Server 建立連線時出現與網路相關的或特定於例
sql server之exists用法
nbsp http ima 技術分享 mage .com .cn img bsp sql server之exists用法
SQL Server2008附加數據庫之後顯示為只讀時解決方法
這一 -- 技術 false log 美好 使用 com 你會 方案一: 碰到這中情況一般是使用的sa賬戶登錄的,只要改為Windows身份驗證,再附加數據庫即可搞定。 方案二: 使用sa登錄SQL Server2008附加數據庫,附加之後數據庫為只讀的,然後點數據庫
SQL Server2008中通過SQL獲取表結構
nds 數據 join xtend isn val data 運行 order SQL Server2008中通過SQL獲取表結構 新增數據用戶,角色為public。映射到待獲取表結構的數據庫上,授與用戶在該數據庫上的身份為db_owner 運行例如以下SQL語