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

MSSQL
无数据库日志文件恢复数据库方法两则(一)
SQLServer编写存储过程小工具(一)
SQLServer编写存储过程小工具(二)
SQLServer编写存储过程小工具(三)
Eclipse+JBoss+MySQL开发环境设置
MYSQL使用简述
一些有用的sql语句实例
枚举SQLServer的实例
SQLServer应用程序中的高级SQL注入
SQL Server数据库超级管理员账号防护知识
讲解如何实现互联网上数据库的安全
SQL 2005数据库转到SQL 2000的步骤讲解
带你轻松接触数据库生成xml的两个方法
用MS SQL Reporting Services生成报表
保护SQL Server的十个步骤
关于SQL SERVER的一些安全问题
SQL Server 2008数据库中使用表值参数
SQL Server 2005中用存储过程实现搜索功能
MS SQL数据库置疑解决办法
SQL Server密码管理的六个危险判断

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 163 ::
收藏到网摘: 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跟踪相关性拥有诸多好处。用户可能喜欢寻找存储的过程,该过程引用并不存在的对象,因为这帮助用户寻找不再使用或需要更新的任何存储的过程。