在SQL Server中如何查看資料庫視圖的定義呢? 其實官方文檔已經有一個較詳細的總結了,這裡在官方文檔的基礎上,我們再深入展開分析一下,例如如何獲取系統視圖的定義。知其然知其所以然嗎。 1:使用SQL Server Management Studio(SSMS) 在“對象資源管理器”中,首先找到... ...
在SQL Server中如何查看資料庫視圖的定義呢? 其實官方文檔已經有一個較詳細的總結了,這裡在官方文檔的基礎上,我們再深入展開分析一下,例如如何獲取系統視圖的定義。知其然知其所以然嗎。
1:使用SQL Server Management Studio(SSMS)
在“對象資源管理器”中,首先找到對應資料庫中需要查看定義的視圖,右鍵單擊獲取對象的定義腳本。這種方式非常簡單。在此略過。
2:通過腳本查看視圖的定義。
可以通過下麵三種方式獲取定義腳本,如下所示
USE YourSQLDba;
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('PerfMon.SessionInfo');
GO
USE YourSQLDba;
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('PerfMon.SessionInfo')) AS ObjectDefinition;
GO
USE YourSQLDba;
GO
EXEC sp_helptext 'PerfMon.SessionInfo';
那麼上面方式可以查看系統視圖的定義嗎? 實驗驗證測試一下即可知道。
1:首先,在SSMS的“對象資源管理器”中是是無法查看系統視圖的定義的。SSMS直接屏蔽了相關功能。
2:上面三種腳本方式,sys.sql_modules 無法查看系統視圖定義,內置函數OBJECT_DEFINITION、系統存儲過程OBJECT_DEFINITION可以查看系統視圖的定義。
系統視圖無法查看對應的系統定義是因為條件限制原因(has_access('CO', o.id) = 1),如下所示:
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE VIEW sys.sql_modules AS
SELECT object_id = o.id,
definition = object_definition(o.id),
uses_ansi_nulls = sysconv(bit, o.status & 0x40000), -- OBJMOD_ANSINULLS
uses_quoted_identifier = sysconv(bit, o.status & 0x80000), -- OBJMOD_QUOTEDIDENT
is_schema_bound = sysconv(bit, o.status & 0x20000), -- OBJMOD_SCHEMABOUND
uses_database_collation = sysconv(bit, o.status & 0x100000), -- OBJMOD_USESDBCOLL
is_recompiled = sysconv(bit, o.status & 0x400000), -- OBJMOD_NOCACHE
null_on_null_input = sysconv(bit, o.status & 0x200000), -- OBJMOD_NULLONNULL
execute_as_principal_id = x.indepid,
uses_native_compilation = sysconv(bit, case when (o.type = 'P') then o.status & 0x00000200 else 0 end) -- OBJPRC_HEKATON
FROM sys.sysschobjs o
LEFT JOIN sys.syssingleobjrefs x ON x.depid = o.id AND x.class = 22 AND x.depsubid = 0 -- SRC_OBJEXECASOWNER
WHERE o.pclass <> 100 -- x_eunc_Server
AND ((o.type = 'TR' AND has_access('TR', o.id, o.pid, o.nsclass) = 1)
OR (type IN ('P','V','FN','IF','TF','RF','IS') AND has_access('CO', o.id) = 1)
OR (type IN ('R','D') AND o.pid = 0))
AND (o.status2 & 0x00000020) = 0
GO
如果你到這一步以為就結束了的話,那麼你太天真了。內置函數OBJECT_DEFINITION、系統存儲過程OBJECT_DEFINITION對於有些視圖也束手無策。如下所示,獲取系統視圖sys.parameters的定義如下。
CREATE VIEW sys.parameters
AS
SELECT object_id ,
name ,
parameter_id ,
system_type_id ,
user_type_id ,
max_length ,
PRECISION ,
scale ,
is_output ,
is_cursor_ref ,
has_default_value ,
is_xml_document ,
default_value ,
xml_collection_id ,
is_readonly ,
is_nullable
FROM sys.parameters$
WHERE number = 1
其實對象sys.parameters$也是一個視圖,正常情況下是無法查看sys.parameters$這個對象的,在專用管理員模式(DAC)下麵才可以查看sys.parameters$的定義,而且只能通過系統內置函數OBJECT_DEFINITION,而sp_helptext 是會報錯的。如果你要弄清楚一些系統視圖的定義,那麼基本上就要藉助專用管理員模式(DAC)模式來查看。