热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » MySQL/MSSQL编程 » 使用SQL Server 2008中对象相关性

使用SQL Server 2008中对象相关性

论坛链接
  • 使用SQL Server 2008中对象相关性
  • 发布时间:2008-12-14 15:03:53    浏览数:6085    发布者:abcdef133    设置字体【   
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跟踪相关性拥有诸多好处。用户可能喜欢寻找存储的过程,该过程引用并不存在的对象,因为这帮助用户寻找不再使用或需要更新的任何存储的过程。
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理