200912252346SQL:DB 物件的名稱 - Server.DB.Schema.Table
在SQL中,其完整的物件名稱包含[Server Name].[DataBase Name].[Owner Name].[Table Name],因為大部分的專案的資料表都來自同一個資料庫(DataBase) ,所以大家也就習慣在叫用資料表(Data Table)時,直接使用資料表名稱,也就忽略的其實物件的完整名稱是包含四個部分的。
常見的查詢 SELECT * FROM employees,其employees 即是資料表名稱。我想鮮少人會寫得這麼完整 SELECT [EmployeeID] ,[LastName] ,[FirstName] ,[Title] ........ FROM [northwind].[dbo].[Employees]。
有寫與沒寫物件的全部名稱有什麼差呢?
如果貴公司的DB是採用集中管理式,想必在該資料庫中會同時存在許多子單位個別的資料表,並且會有對應的機制判別哪個資料表是屬於那個部門的。
同一資料表名稱只能有一個存在資料庫中,但是類似 Product、Sales、Orders這樣的名稱卻是許多部門所需要的,該怎麼辦?而是很多人會採用代號+分隔線+資料表名稱來當作為所使用的資料表名稱,例如 sales_product、rd_product、fab_product...等等表示各部門。
雖然採用集中式管理,但是資料表可不能給其他部門的人看到內容,所以資料庫管理者(DBA)必須,一個一個Table仔細的去設定給某單位或某個人,只有某些公司共用資料表才得以唯獨共用。
人員異動、部門調整DBA都得仔細個別調整一番。
※※SQL2005/2008之後,將物件名稱做了些許改變,改成※
[Server Name].[DataBase Name].[Schema].[Table Name]
schema 是一個 namespace,它包含了一組資料庫物件(例如:table),而且是由某個 user 或 role 所擁有。Ref
為了向下相容,其 schema 預設為 Owner Name,也就是以那個User 建立 table,第三個物件部分就是該 User 名稱,例如 [northwind].[dbo].[Employees]。dbo = db owner
這樣有啥好處?--我們先來看一個問題,當某 user (tolarku)執行了一個SQL query
SELECT * FROM employees
這時SQL會先去找 tolarku.employees 資料表看存不存在,若不存在則繼續找 dbo.employees
---------------------使用(多了)schema 好處是?
1.同一資料庫中只要以 schema 區分,便可以使用同一資料表名稱
Ex: sales.employees、rd.employees 或 fab.employees
2.要設定權限時,可以以 schema 為 Group 對象,給予不同的權限等級與使用者,意即當某一新進 RD 需要存取整個RD部門的資料表時,DBA只需要將該RD加入到 RD schema 中及完成權限的設定,不再需要一個一個資料表慢慢設。
--------------------有什麼需要改的嗎?
建議程式開發人員,在使用 SQL 2005/2008時,資料表指定改用 2-part Name,也就是
SELECT * FROM rd.employees
這樣就能讓管理工作變得更輕鬆如意了。
~End
...Merry x'mas