识别SQL Server中的对象产生的依赖性 (1)

  • 来源: 赛迪网 作者: 小唐   2009-08-02/09:08
  • 有没有一种方法可以识别哪个对象依赖SQL Server数据库中的其它对象呢?我需要修改表结构来添加新列。然而,在进行任何更改之前,我想确定自己理解了所有的对象依赖性。在SQL Server 2008中有没有一种方法可以快速识别所有的对象依赖性呢?

    在SQL Server以前的版本中,对象依赖性是通过对象的ID进行跟踪的,结果跟踪对象依赖性就变得很困难。然而,在SQL Server中,对象是通过对象名称而不是对象ID进行跟踪。使用这种方法最大的好处是你可以跟踪对象依赖性,即使这个对象已经从数据库中删除,你仍然可以跟踪它的依赖性,如果一个对象尚未在数据库中创建,你也可以跟踪它。

    在SQL Server 2008中有两个新的动态管理函数和一个系统视图,我们可以用它们来跟踪对象依赖性。SQL Server 2008新引进的跟踪对象依赖性的动态管理函数是sys.dm_sql_referenced_entities和sys.dm_sql_referencing_entities。新引进的跟踪对象依赖性的系统视图是sys.sql_expression_dependencies。

    无论何时创建、删除或者修改参照实体,SQL Server 2008数据库引擎都会自动跟踪对象依赖性信息并且把这些信息保存在SQL Server系统目录中。当一个对象以名称的形式出现在存储在另一个对象中的SQL语句内时,一个依赖性在这两个对象间创建。这个出现在SQL表达中的对象叫做被参照实体,而具有这个SQL表达的对象叫做参照实体。

    sys.sql_expression_dependencies系统视图总述

    sys.sql_expression_dependencies系统视图为每个依赖当前数据库中其它对象的用户定义对象保存一条记录。当一个调用被参照对象的对象以名称的形式出现在另一个对象的SQL表达中时,两个对象间的依赖性就创建了。基本上这里有两种通过SQL Server 2008的数据库引擎跟踪的依赖性类型,分别叫做架构绑定依赖性和非架构绑定依赖性。

    架构绑定依赖性: - 一个架构绑定依赖性是存在于防止被参照对象在参照对象存在时被删除或者被修改的两个对象间的一种关系。架构绑定依赖性可能是一个视图或者一个用户定义函数,它们可以通过WITH SCHEMABINDING从句创建。

    非架构绑定依赖性: - 一个非架构绑定依赖性是存在于不阻止被参照对象删除或修改的两个对象间。

    sys.dm_sql_referenced_entities动态管理函数总述

    sys.dm_sql_referenced_entities动态管理函数为每个被特定参照对象定义内的名称参照的用户定义对象返回一行。例如,如果一个用户定义视图是这个特定的参照对象,那么通过使用sys.dm_sql_referenced_entities动态管理函数,你可以返回在视图定义中参照的所有用户定义对象,比如表、函数等等。

    sys.dm_sql_referencing_entities动态管理函数总述

    sys.dm_sql_referencing_entities动态管理函数为当前数据库中的每个用户定义对象返回一条记录,这个用户定义对象以名称形式参照另一个用户定义对象。例如,如果有一个视图参照三张表,那么这个函数将为每个表引用返回三条记录。这个函数也会返回架构绑定实体或者非架构绑定实体、数据库级别和服务器级别DDL触发器的依赖性信息。

    识别对象依赖性的实例

    让我们通过一个实例来了解SQL Server 2008数据库引擎是怎样跟踪对象依赖性的。使用下面的T-SQL脚本来创建一张叫做Employee的表。

    Use SampleDB 
    GO
    
    /* Create Employee Table */
    
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Employee]') AND type in (N'U'))
    
    DROP TABLE [dbo].[Employee]
    
    GO
    
    CREATE TABLE [dbo].[Employee]
    
    (
    
    [Emp_ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    
    [Last_Name] [nvarchar](50) NULL,
    
    [First_Name] [nvarchar](50) NULL,
    
    [Age] [int] NULL,
    
    )
    
    GO

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多