使用不同名称重新附加数据库后,如何刷新 SQL Server 跨数据库引用?(有隐藏的同义词吗?)

And*_*rew 3 sql-server backup

我在同一个 SQL 实例上有 2 个单独的 SQL 数据库。Database1 在其视图和存储过程中引用 Database2 上的表。一切正常,直到我们不得不创建一个新版本的 Database2 并将当前的 Database2 重命名为 Database3。

DBA 执行了以下操作:

  1. 使 Database2 脱机,然后将其重新附加为 Database3。然后从 SQL 中删除了 Database2。

  2. 创建了一个新版本的 Database2。

问题:

除非我们将服务器名称添加到任何查询中的 FROM 子句,否则 Database1 中的视图和存储过程仍在引用 Database3 上的表。

Database1 上的以下视图错误地转到 Database3:

select * from Database2.dbo.Projects
Run Code Online (Sandbox Code Playgroud)

为了正确的行为,我们指定服务器名称:

select * from ProductionDB.Database2.dbo.Projects
Run Code Online (Sandbox Code Playgroud)

为什么 Database1 的视图和存储过程仍然引用 Database3(除非我们指定服务器名称)?

是不是因为我们通过重新附加而不是备份和还原来重命名数据库?

Database1 中是否有需要更新的内部引用?

是否有我找不到的隐藏数据库同义词?

sql sql-server 备份数据库-管理交叉

Wri*_*ree 5

您可能想要运行sp_refreshview,如果基础表发生变化,建议运行它(这种情况似乎是这种情况的一个很好的候选者)。

我找到了根本原因。生成并缓存视图的解析树:

select * from sys.syscacheobjects
where objtype = 'View'
Run Code Online (Sandbox Code Playgroud)

这是标记器的输出,因此附加分离应该使缓存的标记无效。一个sp_refreshview重建的解析树。

sp_refreshview文档中

更新指定的非架构绑定视图的元数据。视图的持久元数据可能会因为视图所依赖的底层对象的更改而变得过时。