当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 使用SQL Server 2008中对象相关性

MSSQL
浅析SQL Server与Oracle、DB2的比较
SQL Artisan数据库访问组件功能概述
50种方法巧妙优化你的SQL Server数据库
SQL Server 2005数据库管理10个特点
拷贝的SQL Server 7的恢复方法
SQL Server 2000启动1069错误解决方法
SQL Server 2005—数据库管理10个特点
SQL概述及在网络安全中的应用(下)
深入浅出SQL教程之SELECT语句的自连接
SQL Server查询设计:避免10个错误
SQL概述及在网络安全中的应用(上)
某外企SQL Server面试题
解决MSSQL占用过多内存的简单方法介绍
安装SQL Server 2005实例环境图解
步骤指南:如何合并SQL Server
SQL Server查询处理器机制与结构(下)
避免在 SQL Server 中盲目地追求一句处理
Sql Sever数据库自动备份
SQL Server查询处理器机制与结构(上)
精华推荐:加速SQL查询的特征函数法

MSSQL 中的 使用SQL Server 2008中对象相关性


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 110 ::
收藏到网摘: n/a

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的表:

在下边的脚本中,创建了名称为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跟踪相关性拥有诸多好处。用户可能喜欢寻找存储的过程,该过程引用并不存在的对象,因为这帮助用户寻找不再使用或需要更新的任何存储的过程。