我正在更改几个表的架构。目前,所有表都在dbo架构中,需要移动到不同的架构中。
我运行了以下脚本(在许多表上):
ALTER SCHEMA client TRANSFER dbo.Companies
我现在遇到的问题是存在需要更新以使用正确表名的存储过程
dbo.Companies -> client.Companies
有没有办法可以检查哪些存储过程需要检查和修复?
答案 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