验证T-SQL可编程性对象

时间:2011-07-18 13:56:37

标签: sql sql-server refactoring

有没有办法在SQL Server 2008中验证可编程性对象?

我有一个包含~500个可编程对象的数据库,这些对象依赖于其他可编程对象(不仅仅是表)。

如果我进行一些重构,很难找到被更改破坏的其他对象。例如,如果我更改参数计数...

数据库的原始状态:

CREATE FUNCTION [dbo].[GetSomeText]() RETURNS nvarchar(max) AS BEGIN RETURN 'asdf' END

/* uses "GetSomeText()" function */
CREATE FUNCTION [dbo].[GetOtherText]() RETURNS nvarchar(max) AS BEGIN RETURN [dbo].[GetSomeText]() + '-qwer' END

现在我做一些重构(将参数@Num添加到GetSomeText()函数):

ALTER FUNCTION [dbo].[GetSomeText](@Num int) RETURNS nvarchar(max) AS BEGIN RETURN 'asdf' + CAST(@Num as nvarchar(max)) END

现在函数GetOtherText()已被破坏,因为它在没有必需参数的情况下调用GetSomeText()函数。

有没有办法获取有关此错误的信息?

目前,我将每个可编程性对象编写为ALTER,运行alter脚本,并检查错误。这种方式看起来太复杂了(并且很难在仅限T-SQL的环境中使用)。

修改

谢谢你的回答!我知道如何获取所有对象的依赖项或列表。 问题在于检查物体。如果我得到依赖项,是否有其他方法来检查有效性而不是运行ALTER脚本?

3 个答案:

答案 0 :(得分:2)

我认为没有办法找到依赖关系。但是,您可以找到引用您正在更改的对象名称的所有内容,如下所示:

 select OBJECT_DEFINITION(o.object_id) as objectDefinition, *
   from sys.objects o
  where o.type in ('P', 'FN')
    and OBJECT_DEFINITION(o.object_id) like '%GetSomeText%'

o.type in ('P', 'FN')将搜索限制为P - 过程和FN - 标量函数。详细了解OBJECT_DEFINITION:http://msdn.microsoft.com/en-us/library/ms176090.aspx

答案 1 :(得分:1)

也许您可以尝试引入一些自动数据库开发人员/单元测试。

对于500个SQL对象,返回并为它们“复古”将是繁重的。最好的方法可能是逐步创建这些测试,因为需要重构/更改现有API /创建新的SQL对象

然后,这些自动化测试可以作为整体持续集成方法的一部分。请注意,给出的示例仍然存在查找现有依赖项的问题。但是一旦有足够的测试覆盖率,测试应该突出显示所引入的任何重大变化。

我已经创建了一个可能有用的测试工具 - 但是还有很多其他工具:

http://dbtestunit.wordpress.com/

答案 2 :(得分:0)

获得依赖关系的最简单方法之一是使用sp_depends可以使用函数,但您需要确保自己处于正确的数据库环境中:

USE MyDatabase
EXEC sp_depends @objname = N'dbo.FunctionName' 

这将向您显示任何对象,无论是对列出的对象具有依赖关系的函数,存储过程,表或视图。

但是,对于跨数据库依赖性,这并不总是准确的,所以请注意。