在SQL Server 2008中物件相關性的使用
新管理物件
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跟蹤相關性擁有諸多好處。使用者可能喜歡尋找儲存的過程,該過程引用並不存在的物件,因為這幫助使用者尋找不再使用或需要更新的任何儲存的過程。
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跟蹤相關性擁有諸多好處。使用者可能喜歡尋找儲存的過程,該過程引用並不存在的物件,因為這幫助使用者尋找不再使用或需要更新的任何儲存的過程。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-536520/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在SQL Server中,關於with as使用介紹SQLServer
- SQL SERVER 日期相關性優化選項SQLServer優化
- SQL Server 日期相關SQLServer
- sql server 檢視tempdb使用的相關檢視SQLServer
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- 在SQL Server 2008中的SP上使用表型別值引數MHSQLServer型別
- SQL Server 2008 sqlcmd 的使用SQLServer
- 在SQL Server 2008中安裝安全審計SQLServer
- SQL Server 2008稀疏列的使用SQLServer
- SQL Server中,WITH AS的使用SQLServer
- 關於SQL Server 2008的缺失索引功能SQLServer索引
- SQL Server中的SELECT會阻塞SELECT相關資料SQLServer
- sql-server相關子查詢SQLServer
- 關於SQL Server2005/2008中架構的理解SQLServer架構
- SQL Server 2008在Vista下SQLServer
- SQL Server 中的 ACID 屬性SQLServer
- SQL Server中的全域性變數SQLServer變數
- SQL Server 2008中Analysis Services的新特性SQLServer
- SQL Server 2008中的格式化日期SQLServer
- 在cursor遊標中使用dbms_metadata.get_ddl提取依賴其它物件的父物件之相關性物件
- 關於SQL Server 2008是否是SQL Server 2005的一個Service PackSQLServer
- server2008 和window7程式相關的命令Server
- Microsoft SQL Server 2008中SQL Server服務啟動故障問題ROSSQLServer
- SQL Server 2008中的行壓縮(上)JUSQLServer
- SQL Server 2008中的新語句:MERGESQLServer
- SQL Server 2008中的資料壓縮功能SQLServer
- 淺談SQL Server 2008中的行壓縮SQLServer
- SQL Server 2008 使用差異備份SQLServer
- 在pl/SQL中呼叫logminer相關檢視的問題SQL
- SQL Server 2008中SQL增強之三:Merge(在一條語句中使用Insert,Update,Delete)SQLServerdelete
- SQL Server MDX中軸的使用SQLServer
- MS SQL SERVER索引優化相關查詢SQLServer索引優化
- SQL Server 2008 資源調控器安全性SQLServer
- SQL Server 2008中的聯機事務處理SQLServer
- 利用Ring Buffer在SQL Server 2008中進行連線故障排除SQLServer
- [zt] 使用SQL Server中的Linked Server及Remote ServerSQLServerREM
- SQL Server中的高可用性概覽SQLServer
- SQL Server 2008中SQL增強之一:Values新用途SQLServer