如何通过更改架构名称来查看哪些存储过程受到影响

时间:2014-02-11 10:33:38

标签: sql-server tsql stored-procedures

我正在更改几个表的架构。目前,所有表都在dbo架构中,需要移动到不同的架构中。

我运行了以下脚本(在许多表上):

ALTER SCHEMA client TRANSFER dbo.Companies

我现在遇到的问题是存在需要更新以使用正确表名的存储过程

dbo.Companies -> client.Companies

有没有办法可以检查哪些存储过程需要检查和修复?

3 个答案:

答案 0 :(得分:0)

可能有一个最好的方法,因为这个需要一些手动编辑,但这就是我要做的。

我有一个小查询,可以让我搜索存储过程中的字符串。

SELECT     
     sysobjects.name
    ,sysobjects.id
    ,sysobjects.xtype
FROM         
    sysobjects 
INNER JOIN
    syscomments   
ON 
    sysobjects.id = syscomments.id
WHERE      
syscomments.text LIKE '%dbo.Companies%'
GROUP BY 
     sysobjects.name
   ,sysobjects.id
   ,sysobjects.xtype
order by 
    sysobjects.name

该查询将为您提供包含dbo.Companies的所有存储过程的名称,ID和xtype。如果您更改WHERE - 子句以查找移动到其他方案的所有表,您将(希望:))获取您需要更新的所有存储过程的列表。

如果您愿意,您可以修改查询并使用REPLACE更新存储过程正文,并将其全部自动化。但请确保查询首先为您提供正确的结果。我没有将它用于这个用例,我只是用它来搜索存储过程中的文本,但理论上它应该可以工作。

答案 1 :(得分:0)

这将为您提供依赖于dbo.companies的所有对象。请记住,除了存储过程之外,您还需要更改函数,视图和其他对象。

SELECT Db_name()                                   referencing_database_name, 
       Object_name (referencing_id)                referencing_entity_name, 
       Isnull(referenced_schema_name, 'dbo')       referenced_schema_name, 
       referenced_entity_name, 
       ao.type_desc                                referenced_entity_type, 
       Isnull(referenced_database_name, Db_name()) referenced_database_name 
FROM   sys.sql_expression_dependencies sed 
       JOIN sys.all_objects ao 
         ON sed.referenced_entity_name = ao.name  
WHERE sed.referenced_schema_name='dbo' AND sed.referenced_entity_name='Companies' 

答案 2 :(得分:0)

以下是检查依赖性的方法

方法1:使用sp_depends

 sp_depends 'dbo.First'
 GO

方法2:使用information_schema.routines

 SELECT *
 FROM information_schema.routines ISR
 WHERE CHARINDEX('dbo.First', ISR.ROUTINE_DEFINITION) > 0
 GO

方法3:使用DMV sys.dm_sql_referencing_entities

 SELECT referencing_schema_name, referencing_entity_name,
 referencing_id, referencing_class_desc, is_caller_dependent
 FROM sys.dm_sql_referencing_entities ('dbo.First', 'OBJECT');
 GO