我需要找到一种方法来确定数据库中的哪个对象将原始数据库名称硬编码到其中。我已经以不同的名称恢复了数据库的副本,并运行自行开发的脚本来进行所有命名调整。假设原始数据库名为ABC_Db,恢复的副本已重命名为XYZ_Db。当我尝试在CoreTable上执行UPDATE时,我得到了
无效的对象名称'ABC_Db.dbo.CoreTable'
我查询了syscomments并对关系和索引等进行了各种手动检查,没有运气。下一步是什么?
谢谢,
约翰
答案 0 :(得分:3)
找到它
SELECT
OBJECT_NAME(object_id)
FROM
sys.sql_modules
WHERE
definition LIKE '%ABC_Db%'
对于长代码,syscomments是不可靠的。
sys.sql_modules涵盖所有代码,对所有对象都是安全的
答案 1 :(得分:2)
sys.syscomments
文本是nvarchar(4000),因此当定义分割多行时,您可能会遇到截断问题。试试这个。
select quotename(s.name)+'.'+quotename(o.name) as object_name, o.type_desc
from sys.sql_modules m
inner join sys.objects o
on m.object_id = o.object_id
inner join sys.schemas s
on o.schema_id = s.schema_id
where m.definition like '%ABC_Db%'
答案 2 :(得分:2)
如果要搜索Microsoft SQL Server数据库架构,最好的工具是RedGate的SQL搜索 - 它是免费的。太棒了。
http://www.red-gate.com/products/sql-development/sql-search/
答案 3 :(得分:0)
最好的方法是生成数据库脚本并使用文本编辑器搜索文件工具来查找是否存在任何存储过程或其他代码中的内容。
答案 4 :(得分:0)
是否存在具有硬编码的完整对象名称的触发器?
答案 5 :(得分:0)
SQL Prompt 5有一个名为“查找无效对象”的功能,它将标识引用不存在的对象的存储过程。值得一试。