Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 模式更改后如何检测损坏的存储过程?_Sql Server_Database Administration - Fatal编程技术网

Sql server 模式更改后如何检测损坏的存储过程?

Sql server 模式更改后如何检测损坏的存储过程?,sql-server,database-administration,Sql Server,Database Administration,我有一个数据库,其中包含数百个表和数百个存储过程。 数据库架构已更改(e.x:某些表/列已重命名,某些列已删除/添加等) 问题是:如何检测受这些更改影响的过程(在执行时产生错误),而不实际执行它们,因为逐个执行它们是大量手动和耗时的工作 编辑 到目前为止,我找到的最接近的解决方案是: sys.dm_sql_引用的_实体。类似于SELECT*FROM sys.dm_sql_referenced_entities('dbo.procedure_name','OBJECT')的查询 如果过程_名称被这

我有一个数据库,其中包含数百个表和数百个存储过程。 数据库架构已更改(e.x:某些表/列已重命名,某些列已删除/添加等)

问题是:如何检测受这些更改影响的过程(在执行时产生错误),而不实际执行它们,因为逐个执行它们是大量手动和耗时的工作

编辑 到目前为止,我找到的最接近的解决方案是: sys.dm_sql_引用的_实体。类似于
SELECT*FROM sys.dm_sql_referenced_entities('dbo.procedure_name','OBJECT')的查询
如果过程_名称被这些名称破坏,则返回错误
变化

因此,我可以获得所有过程的名称并运行上层程序 在循环中查询每个过程名称,并在 例如,在中打印过程名称 错误案例



您可以尝试此查询,请注意,在某些情况下,此查询还可能列出误报

查询以获取
无效对象的列表:

select QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
       o.type_desc,
       ISNULL(QuoteName(referenced_server_name) + '.', '')
         + ISNULL(QuoteName(referenced_database_name) + '.', '')
         + ISNULL(QuoteName(referenced_schema_name) + '.', '')
         + QuoteName(referenced_entity_name) AS MissingReferencedObject
from   sys.sql_expression_dependencies sed
  left join sys.objects o on sed.referencing_id=o.object_id
where  (is_ambiguous = 0)
and  (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
       + ISNULL(QuoteName(referenced_database_name) + '.', '')
       + ISNULL(QuoteName(referenced_schema_name) + '.', '')
       + QuoteName(referenced_entity_name)
     ) IS NULL)
order by ProblemObject, MissingReferencedObject
declare @t table (procname varchar(200), called_in varchar(200))
declare @ProcName varchar(200)

declare crProcs cursor local FAST_FORWARD READ_ONLY for
         select distinct
                o.name as procedure_name
         from   sys.sql_modules m
           inner join sys.objects o ON m.object_id = o.object_id
         where o.Type = 'P'

open crProcs
fetch next from crProcs into @ProcName
while @@FETCH_STATUS = 0
begin
     insert into @t (procname, called_in)
     select @ProcName,
            o.name
     from   sys.sql_modules m
       inner join sys.objects o ON m.object_id = o.object_id
     where  m.definition Like '%' + @ProcName + '%'
     group by o.name

     fetch next from crProcs into @ProcName
end 
close crProcs
deallocate crProcs

select * 
from   @t t
where  1 < (select count(1) from @t t2 where t2.procname = t.procname )
SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc,
       m.*
FROM   sys.sql_modules m
  INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition Like '%MyTableThatIWantToChangeTheScheme%'
可以找到更多信息

在重新设计方案时,其他有用的查询如下

查询以查找从其他程序调用的过程:

select QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
       o.type_desc,
       ISNULL(QuoteName(referenced_server_name) + '.', '')
         + ISNULL(QuoteName(referenced_database_name) + '.', '')
         + ISNULL(QuoteName(referenced_schema_name) + '.', '')
         + QuoteName(referenced_entity_name) AS MissingReferencedObject
from   sys.sql_expression_dependencies sed
  left join sys.objects o on sed.referencing_id=o.object_id
where  (is_ambiguous = 0)
and  (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
       + ISNULL(QuoteName(referenced_database_name) + '.', '')
       + ISNULL(QuoteName(referenced_schema_name) + '.', '')
       + QuoteName(referenced_entity_name)
     ) IS NULL)
order by ProblemObject, MissingReferencedObject
declare @t table (procname varchar(200), called_in varchar(200))
declare @ProcName varchar(200)

declare crProcs cursor local FAST_FORWARD READ_ONLY for
         select distinct
                o.name as procedure_name
         from   sys.sql_modules m
           inner join sys.objects o ON m.object_id = o.object_id
         where o.Type = 'P'

open crProcs
fetch next from crProcs into @ProcName
while @@FETCH_STATUS = 0
begin
     insert into @t (procname, called_in)
     select @ProcName,
            o.name
     from   sys.sql_modules m
       inner join sys.objects o ON m.object_id = o.object_id
     where  m.definition Like '%' + @ProcName + '%'
     group by o.name

     fetch next from crProcs into @ProcName
end 
close crProcs
deallocate crProcs

select * 
from   @t t
where  1 < (select count(1) from @t t2 where t2.procname = t.procname )
SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc,
       m.*
FROM   sys.sql_modules m
  INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition Like '%MyTableThatIWantToChangeTheScheme%'

看起来很老练,很有前途。到目前为止,它已经发现我有大量的程序被破坏。现在我只需要检查一下是否有像你所说的假阳性。@Ergis很好,我希望这能为你节省一些时间。如果可以的话,我很高兴help@Ergis在某些罕见的情况下,当一个过程需要来自另一个数据库的数据时,或者当使用自定义类型时,可能会出现误报。如果你不使用,你将不会有误报