热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用SQLServer2008中对象相关性

SQLServer的以前版本在跟踪对象相关性方面做的并不好。原因是所有的对象相关性都是由对象ID来跟踪的,这意味着对象一开始就必须存在。但是,通过根据对象名称来跟踪对象SQLServer2008极大地扩展了跟踪对象的能力,而不用再依赖ID。该方法

SQL Server的以前版本在跟踪 对象 相关性 方面做的并不好。原因是所有的 对象 相关性 都是由 对象 ID来跟踪的,这意味着 对象 一开始就必须存在。但是,通过根据 对象 名称来跟踪 对象 SQL Server 2008极大地扩展了跟踪 对象 的能力,而不用再依赖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跟踪相关性拥有诸多好处。用户可能喜欢寻找存储的过程,该过程引用并不存在的对象,因为这帮助用户寻找不再使用或需要更新的任何存储的过程。

推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 面对众多的数据分析工具,如何选择最适合自己的那一个?对于初学者而言,了解并掌握几种核心工具是快速入门的关键。本文将从数据处理的不同阶段出发,推荐三种广泛使用的数据分析工具。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • 本文详细探讨了如何根据不同的应用场景选择合适的PHP版本,包括多版本切换技巧、稳定性分析及针对WordPress等特定平台的版本建议。 ... [详细]
  • 本文介绍如何使用R语言中的相关包来解析和转换搜狗细胞词库(.scel格式),并将其导出为CSV文件,以便于后续的数据分析和文本挖掘任务。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • 在Android应用开发过程中,开发者经常遇到诸如CPU使用率过高、内存泄漏等问题。本文将介绍几种常用的命令及其应用场景,帮助开发者有效定位并解决问题。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
author-avatar
紫凝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有