使用SQL Server 2008服務器中的對象相關性
在SQL Server的以前版本中跟蹤對象相關性方面做的并不好。原因是所有的對象相關性都是由對象ID來跟蹤的,這意味著對象一開始就必須存在。但是,通過根據 對象名稱來跟蹤對象SQL Server 2008極大地擴展了跟蹤對象的能力,而不用再依賴ID。該方法的好處是在一些對象已經從數據庫中轉移出去后,還可以繼續跟蹤對象,甚至在對象沒有建立時 也可以進行跟蹤。
新管理對象
SQL Server 2008引進了兩個新動態管理函數和新系統視圖,用于跟蹤對象相關性。這兩個新對象包括Database Engine存儲的有關相關性的信息,這些相關性是在創建、更改和放棄對象時建立的。在一個對象以名稱的形式出現于存儲在另一個對象中的SQL表達式中 時,一個相關性就會在兩個對象之間創建。在表達式中出現的對象稱為被引用實體,而包含SQL表達式的對象稱為引用實體。
sys.sql_expression_dependencies
本視圖含有當前數據庫中用戶定義的一個對象的每個相關性的一個記錄。這些用戶定義的對象可以是存儲在當前數據庫中的對象,或者存儲在不同數據庫中并利用 部分命名規則(databasename.schemaname.objectname)被引用的對象,在不同的服務器上并使用四部分命名規則 (servername.databasename.schemaname.objectname)通過鏈接服務器被引用的對象,以及在特定對象創建時不 存在的對象(稱為延遲對象)。
sys.dm_sql_referenced_entities
用戶在定義特定引用實體時,本函數為通過名稱引用的每個用戶定義的對象返回一個行,例如,如果視圖vw_SampleView引用表Table1 的Field1、 Field2和 Field3,則將返回四行,針對被引用字段返回三行,針對表引用返回一行。
sys.dm_sql_referencing_entities
該函數為用戶在當前數據庫中定義的每個對象返回一個記錄,這些對象通過名稱引用另一個用戶定義的對象。例如,如果視圖vw_SampleView引用Table1 和 Table2,則該函數返回兩個記錄,針對每個表引用返回一個記錄。
舉例
以下示例顯示了如何通過創建一些對象和查詢新DMV在數據庫內部跟蹤相關性。利用下邊的腳本創建名稱為SalesHistory的表:
CREATE TABLE [dbo].[SalesHistory](
[SaleID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[Product] [char](150) NULL,
[SaleDate] [datetime] NULL,
[SalePrice] [money] NULL
)
在下邊的腳本中,創建了名稱為dbo.usp_GetSales的存儲的過程,該過程引用在以上腳本中創建的SalesHistory表: CREATE PROCEDURE dbo.usp_GetSales
(
@Product VARCHAR(10)
)
AS
BEGIN
SELECT COUNT(SaleID) AS SalesCount, SUM(SalePrice) AS SalesAmount
FROM dbo.SalesHistory sh
END
下邊的腳本使用表值函型數sys.dm_sql_referenced_returns尋找所有引用SalesHistory表的對象。這一查詢不但返
回SalesHistory表的引用,還包含被引用的SalesHistory表中的字段。值得注意的是CROSS
APPLY操作符的使用,這是因為實體是表值型函數,而且在將字段值賦予表值型函數時需要APPLY操作符。還要注意,如果遇到引用一個不存在的實體字
段, 對sys.dm_referenced_entities函數的調用會出錯: SELECT ReferencedEntityName = o.name, g.referenced_entity_name, referenced_minor_name
FROM sys.objects o
JOIN sys.schemas s on o.schema_id = s.schema_id
CROSS APPLY sys.dm_sql_referenced_entities(s.name + '.' + o.name, 'OBJECT') g
WHERE referenced_entity_name = 'SalesHistory'
在下邊的腳本中,創建了一個新的名稱為usp_GetSalesFromArchive的存儲的過程,該過程引用不存在的SalesHistoryArchive 表
CREATE PROCEDURE usp_GetSalesFromArchive
(
@Product VARCHAR(10)
)
AS
BEGIN
SELECT COUNT(SaleArchiveID) AS SalesCount, SUM(SaleArchivePrice) AS SalesAmount
FROM dbo.SalesHistoryArchive sh
END
現在可以利用 sys.sql_expression_dependencies系統視圖尋找引用SalesHistoryArchive 表的任何對象。
或者,可以稍微改變該查詢來尋找存儲的過程usp_GetSalesFromArchive引用的表.
SELECT ReferencingObject = o.name ,
ReferencedObject = d.referenced_entity_name
FROM sys.sql_expression_dependencies d
join sys.objects o on d.referencing_id = o.object_id
WHERE o.name = 'usp_GetSalesFromArchive'
通過對象名稱而不是對象ID跟蹤相關性擁有諸多好處。用戶可能喜歡尋找存儲的過程,該過程引用并不存在的對象,因為這幫助用戶尋找不再使用或需要更新的任何存儲的過程。
關鍵字:Server、存儲、數據庫
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解