场景是,我有2个数据库。 db1和db2。我在db2中有超过45个存储过程,它们与db1中的表连接。我可以通过db1.dbo.tablename
来做,但是因为如果我将db1重命名为db3。所有db2存储过程都失败了。该怎么办?按照客户要求,他想重命名db1。通过find db1脚本替换db3不是好方法。因为如果客户端要求将db3数据库重命名为另一个名称,那么这是永久性的繁琐和不专业的工作。我应该在这里使用什么?
答案 0 :(得分:1)
创建同义词。引用对象中的同义词。如果数据库发生更改,则只需更改每个对象的一个同义词。无需更改代码中的逻辑名称,但如果您通过同义词控制访问权限,则只需在一个位置更改它。
例如
没有同义词:
db2中的六个存储过程引用对象db1..Table1
和db1..Table2
将db1
重命名为db7
时,需要在六个存储过程中更改两个对象。
使用同义词:
六个存储过程引用同义词snTable1
和snTable2
(在本地数据库中 - 注意这里没有数据库引用)
同义词snTable1
是指db1.Table1
将db1
重命名为db7
时,需要更改两个同义词以指向新数据库。不需要更改存储过程。引用同义词的所有对象仍然有效。
这要求您在db2
中创建指向db1
中对象的同义词,并在db2
中初始重写存储过程以引用本地同义词而不是数据库限定对象。但你还是需要这样做吗?
示例程序
在db2
中创建一个名为snTable1的同义词,引用Table1
中的db1
USE db2
CREATE SYNONYM snTable1 FOR db1.Table1
更改您的45个存储过程以引用snTable1
,而不是db1.Table1
。你只需要这样做一次。请注意,这些存储过程引用本地数据库中的对象。
如果您的数据库重命名为xyz,请重新创建同义词:
USE DB2
DROP SYNONYM snTable1
CREATE SYNONYM snTable1 FOR xyz.Table1
仅当存储的程序/视图比对象多得多时才有用。
如果您希望动态更改这些,您可以使用DMO或PowerShell或生成一些T-SQL来执行此操作。您只需使用具有适当安全性的用户对数据库运行上述命令。
另一个非常令人不愉快的选项可能是使用硬编码登录创建到本地数据库的链接服务器,其默认数据库是您想要的数据库。但它隐藏了真正访问该对象的用户,并可能引入了性能问题。简而言之,这是不好的做法。我质疑为什么数据库需要重命名。没有最终用户应该看到它。如果你看看Sharepoint数据库,他们有可怕的名字,但这与最终用户无关。
示例链接服务器程序
db1
访问权限且默认数据库为db1
MyLinkedServer
)到本地数据库db2
中的所有代码,以通过此链接服务器使用四部分命名:SELECT * FROM MyLinkedServer...Table1
这只是一个理论,如果它运作不好的做法......比需要重命名数据库更糟糕的做法。