Stored procedures 如何在另一个数据库中创建一个数据库对象';什么是存储过程?

Stored procedures 如何在另一个数据库中创建一个数据库对象';什么是存储过程?,stored-procedures,sql-server-2008-r2,synonym,object-oriented-database,Stored Procedures,Sql Server 2008 R2,Synonym,Object Oriented Database,场景是,我有2个数据库。db1和db2。我在db2中有大约45个以上的存储过程,它们与db1中的表连接。我可以通过db1.dbo.tablename来完成,但是如果我将db1重命名为db3。所有db2存储过程都失败。我们应该采取什么措施?按照客户的要求,像往常一样,他想重命名db1。在脚本db1到db3中按find replace不是好方法。因为若客户机再次要求将db3数据库重命名为另一个名称,那个么这将是一项长期乏味且不专业的工作。我应该在这里用什么 创建同义词。引用对象中的同义词。如果数据库

场景是,我有2个数据库。db1和db2。我在db2中有大约45个以上的存储过程,它们与db1中的表连接。我可以通过
db1.dbo.tablename
来完成,但是如果我将db1重命名为db3。所有db2存储过程都失败。我们应该采取什么措施?按照客户的要求,像往常一样,他想重命名db1。在脚本db1到db3中按find replace不是好方法。因为若客户机再次要求将db3数据库重命名为另一个名称,那个么这将是一项长期乏味且不专业的工作。我应该在这里用什么

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

比如说

没有同义词:

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

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

同义词:

六个存储过程引用同义词
snTable1
snTable2
(在本地数据库中-注意此处没有数据库引用)

同义词
snTable1
指的是
db1。Table1

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

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

示例程序

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

    使用db2

    为db1.Table1创建同义词snTable1

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

  • 如果数据库重命名为xyz,请重新创建同义词:

    使用DB2

    删除同义词snTable1

    为xyz.Table1创建同义词snTable1

  • 这仅在存储过程/视图比对象多得多的情况下才有用

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

    另一个可能会起作用的非常令人不快的选项是使用硬编码登录名创建一个链接到本地数据库的服务器,该登录名的默认数据库就是您想要的数据库。但是它隐藏了真正访问对象的用户,并且可能会带来性能问题。简言之,这是个坏习惯。我质疑为什么需要如此频繁地重命名数据库。最终用户不应该看到它。如果你看一下Sharepoint数据库,它们的名字很难看,但这与最终用户无关

    链接服务器过程示例

  • 创建一个用户,该用户只能访问
    db1
    ,其默认数据库为
    db1
  • 使用在步骤1中创建的用户在SQL server上创建一个链接到本地数据库的服务器(例如称为
    MyLinkedServer
  • 更改
    db2
    中的所有代码,通过该链接服务器使用四部分命名:
    SELECT*FROM MyLinkedServer…Table1
  • 如果数据库名称更改,则可能不需要更改

  • 这只是一个理论,如果它起作用,它的坏习惯。。。比需要重命名数据库更糟糕的做法。

    但是同义词表示表名而不是数据库名。我说得对吗?是的。您引用了本地数据库中的同义词。此同义词指向的对象可能在另一个数据库中,也可能不在另一个数据库中。在同义词中定义数据库链接,而不是在引用同义词的存储过程中定义数据库链接。请参见上面的示例。没有,但是在db2中使用同义词时,我仍然需要使用db1名称,比如,从db1.dbo.synonym1中选择*。或者希望使用一些可配置的名称,而不是db1.No。您可以在与存储过程相同的数据库中创建同义词。然后,在引用它时,不需要使用DB名称来限定它。创建同义词时,即硬编码数据库名称时。没有办法避免对数据库名称进行硬编码,但可以大大减少需要维护的对象数量。我想我的例子是错误的。我会澄清。请提供参考链接或例子。我找不到。