5

我知道 不支持数据库CREATE SYNONYM,但我希望实现它提供的功能。

我们有数据库 A,其中包含数据库 B 上的表的视图。问题是“数据库 B”并不总是称为“数据库 B”。我们使用数据库项目进行部署,如果没有“数据库 B”,目前会出现“无效的对象名称”错误。

目前的解决方法是打开 .dbschema 文件并进行查找和替换。我想另一种选择是创建大量表同义词。

在不单独更改每个视图的情况下更改多个视图引用的数据库的最佳方法是什么?

谢谢

4

2 回答 2

5

同义词是一个很好的方法来做到这一点。但是,您必须在对象级别创建同义词(正如您所发现的那样)。一种简单的方法是编写一个脚本,该脚本遍历 DatabaseB 中的表列表(来自您的示例),并为 DatabaseA 中的每个表创建一个同义词。保持同义词的名称相同,这样您视图中的代码就不必更改。例如,您在 DatabaseB 中有 tbl_a、tbl_b 和 tbl_c,您希望您的脚本最终执行以下操作:

create synonym [otherDb].[tbl_a] for [DatabaseB].[schemaB].[tbl_a]
create synonym [otherDb].[tbl_b] for [DatabaseB].[schemaB].[tbl_b]
create synonym [otherDb].[tbl_c] for [DatabaseB].[schemaB].[tbl_c]

现在,在您的视图代码中,您将始终使用 [otherDb].[tbl_a]、[otherDb].[tbl_b] 和 [otherDb].[tbl_c]。希望这是有道理的。

于 2011-11-28T15:38:17.353 回答
2

去年,我帮助我现在的客户实施了一个非常相似的设计。我们编写了一组自动生成视图的函数和存储过程。每当您需要更改目标数据库时,它都会生成代码以删除和重新创建所有视图。

代码并不太难。它只是使用系统表来生成视图代码。我还写了一个 Powershell 原型,它使用 SMO 来做同样的事情。关键是让它自动化到需要一个呼叫的地步,这样您就可以轻松准确地完成它。

我们还包括一个异常表,它使用表的模式匹配从视图生成中排除。它包括一个模式列和一个表名列,每个列都接受LIKE模式,因此您可以输入“my_schema”和“%”来排除 my_schema 模式中的所有表。

一个主存储过程接受目标数据库名称并生成整个脚本。生成脚本后,您可以在 SSMS 中运行它,也可以使该部分自动化。

如果您只想生成同义词,这整个事情会更容易。我们正在使用视图,以便我们可以更改列列表等,并使视图数据库看起来与需要的目标数据库不同。

于 2011-11-28T14:54:47.300 回答