欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【使用SQL Server 2008中对象相关性】,下面是详细的分享!
使用SQL Server 2008中对象相关性
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]( [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 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 , 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 2008中对象相关性,下面是编辑为你推荐的有价值的用户互动:
相关问题:sql server 2008 插入数据时 提示对象名无效,,之...
答:有2个方法你可以试下 1、在连接的时候指定数据库,貌似在创建连接语句的时候没有看见数据库名 2、insert语句的表明指定数据库 比如 insert into mydb..userInfo 试下能否成功 >>详细
相关问题:SQL Server 2008中数据库里存放多少种对象?
答:数据类型: 精确数字:bigint、decimal、int、numeric、smallint、money、tinyint、smallmoney、bit 近似数字:float、real 日期和时间:datetime、smalldatetime 字符串:char、text、varchar Unicode字符串:nchar、ntext、nvarchar 二进制字符串:b... >>详细
相关问题:今天不小心把“Microsoft SQL Server 2008R2管理对...
答:我马上看看哦 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
