我的一種模式中的表未在 INFORMATION_SCHEMA.TABLES 中列出。可能是什麼原因?
我的 SQL Server 數據庫中有三個架構,但是當我查詢時
INFORMATION_SCHEMA.TABLES
只列出屬於其中兩個架構的表。未列出第三個模式中的表。可能是什麼原因?我的查詢是:
USE MyDatabase SELECT * FROM INFORMATION_SCHEMA.TABLES;
我認為這是一個權限問題,但我找不到它。我已經比較了模式(及其所有者角色)並且它們的權限看起來相同。我找不到它們之間的任何區別。
我想列出所有表,而不是模式。即使我執行
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
我的第三個模式也不在結果中。當我執行時,
SELECT OBJECT_ID('Schema3.Table1')
我收到NULL
,而結果SELECT OBJECT_ID(Schema2.Table1)
是object_id
.
Aaron Bertrand 在這裡有一篇很棒的文章,介紹了為什麼您不應該信任 INFORMATION_SCHEMA 視圖 - SQL Server 上不可靠的 information_schema 架構資訊?
總結一下:
1)。文件中的措辭不准確,正在更正中(請參閱 Connect #686118)。我不確定他們是否會同時更正 2005、2008 和 2008 R2 文件,或者是否會更新舊版本。關鍵是我無法想像任何一個視圖中的模式都不正確的情況,但更重要的是,info_schema 不正確而 sys.objects 是正確的。後者是不可能的 - info_schema 視圖完全基於 sys.objects 視圖(只需查看 SELECT OBJECT_DEFINITION (OBJECT_ID (‘INFORMATION_SCHEMA.TABLES’));),所以如果一個不正確,它們都是不正確的。可能有一些模糊的情況,它們都可能不正確,但在目前版本中不會(例如,在 SQL Server 2000 中,啟用了 config 選項允許更新,
2)。通常,應避免使用 INFORMATION_SCHEMA 視圖,而應使用 SQL Server 2005 中引入的目錄視圖(並從那時起增加)。為什麼?因為隨著向 SQL Server 添加新功能,目錄視圖會繼續開發,而 info_schema 視圖則沒有。正如我在評論中提到的,嘗試在 info_schema 中查找有關過濾索引的資訊。包含列、XML 索引、標識/計算列、針對唯一索引的外鍵也是如此——這些要麼完全失去,要麼在 info_schema 視圖中以不同方式表示。在 Denali,他們為 Sequences 添加了一個 info_schema 視圖,但這再次滿足了標準的最低要求,並且不包括任何有關 SQL Server 特定實現細節的資訊(例如,它是否已用盡,如果他們將來添加任何新功能,您可以確定 info_schema 視圖不會保留在循環中)。您堅持使用 info_schema 視圖的唯一情況是(a)您正在編寫需要跨 info_schema 兼容平台工作的元數據常式,並且(b)您沒有使用任何將被錯過的特定於平台的功能。除了多平台供應商工具之外,這可能是一種非常罕見的情況(即使在這種情況下,也可能會導致使用這些功能的客戶不滿意,而該工具沒有使用這些功能)。t 使用將被錯過的任何特定於平台的功能。除了多平台供應商工具之外,這可能是一種非常罕見的情況(即使在這種情況下,也可能會導致使用這些功能的客戶不滿意,而該工具沒有使用這些功能)。t 使用將被錯過的任何特定於平台的功能。除了多平台供應商工具之外,這可能是一種非常罕見的情況(即使在這種情況下,也可能會導致使用這些功能的客戶不滿意,而該工具沒有使用這些功能)。
3)。我送出了單獨的 Connect 建議 (Connect #686121),他們會在 Books Online 中的所有 INFORMATION_SCHEMA 視圖主題上貼上關於這種不完整的警告。我不認為眾所周知,它們不是從 SQL Server 中獲取元數據的首選方式,誰能責怪人們沒有看到這一點——畢竟,我們總是被告知使用符合標準的方法是一種“最佳實踐”和使用專有方法是相反的。與許多數據庫事物一樣,“這取決於” - 但我懷疑,通常情況下,您最好使用 sys 目錄視圖,除非您處於僅使用 SQL 中的功能的罕見場景標准通用的伺服器。我不認為我