如何在另一个数据库的存储过程中创建一个数据库对象?

时间:2014-03-12 01:03:43

标签: stored-procedures sql-server-2008-r2 synonym object-oriented-database

场景是,我有2个数据库。 db1和db2。我在db2中有超过45个存储过程,它们与db1中的表连接。我可以通过db1.dbo.tablename来做,但是因为如果我将db1重命名为db3。所有db2存储过程都失败了。该怎么办?按照客户要求,他想重命名db1。通过find db1脚本替换db3不是好方法。因为如果客户端要求将db3数据库重命名为另一个名称,那么这是永久性的繁琐和不专业的工作。我应该在这里使用什么?

1 个答案:

答案 0 :(得分:1)

创建同义词。引用对象中的同义词。如果数据库发生更改,则只需更改每个对象的一个​​同义词。无需更改代码中的逻辑名称,但如果您通过同义词控制访问权限,则只需在一个位置更改它。

例如

没有同义词:

db2中的六个存储过程引用对象db1..Table1db1..Table2

db1重命名为db7时,需要在六个存储过程中更改两个对象。

使用同义词:

六个存储过程引用同义词snTable1snTable2(在本地数据库中 - 注意这里没有数据库引用)

同义词snTable1是指db1.Table1

db1重命名为db7时,需要更改两个同义词以指向新数据库。不需要更改存储过程。引用同义词的所有对象仍然有效。

这要求您在db2中创建指向db1中对象的同义词,并在db2中初始重写存储过程以引用本地同义词而不是数据库限定对象。但你还是需要这样做吗?

示例程序

  1. db2中创建一个名为snTable1的同义词,引用Table1中的db1

    USE db2

    CREATE SYNONYM snTable1 FOR db1.Table1

  2. 更改您的45个存储过程以引用snTable1,而不是db1.Table1。你只需要这样做一次。请注意,这些存储过程引用本地数据库中的对象。

  3. 如果您的数据库重命名为xyz,请重新创建同义词:

    USE DB2

    DROP SYNONYM snTable1

    CREATE SYNONYM snTable1 FOR xyz.Table1

  4. 仅当存储的程序/视图比对象多得多时才有用。

    如果您希望动态更改这些,您可以使用DMO或PowerShell或生成一些T-SQL来执行此操作。您只需使用具有适当安全性的用户对数据库运行上述命令。

    另一个非常令人不愉快的选项可能是使用硬编码登录创建到本地数据库的链接服务器,其默认数据库是您想要的数据库。但它隐藏了真正访问该对象的用户,并可能引入了性能问题。简而言之,这是不好的做法。我质疑为什么数据库需要重命名。没有最终用户应该看到它。如果你看看Sharepoint数据库,他们有可怕的名字,但这与最终用户无关。

    示例链接服务器程序

    1. 创建只有db1访问权限且默认数据库为db1
    2. 的用户
    3. 使用在步骤1中创建的用户在SQL Server上创建一个链接服务器(例如,名为MyLinkedServer)到本地数据库
    4. 更改db2中的所有代码,以通过此链接服务器使用四部分命名:SELECT * FROM MyLinkedServer...Table1
    5. 如果数据库名称发生更改,则可能无需进行任何更改
    6. 这只是一个理论,如果它运作不好的做法......比需要重命名数据库更糟糕的做法。