【问题标题】:How to create one database object in another database's stored procedure?如何在另一个数据库的存储过程中创建一个数据库对象?
【发布时间】:2014-03-12 01:03:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    例如

    没有同义词:

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

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

    同义词:

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

    同义词snTable1指的是db1.Table1

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

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

    示例过程

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

      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

    这仅在存储过程/视图远多于对象时才有用。

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

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

    链接服务器程序示例

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

    这只是一个理论,如果它行得通,那么它的做法是不好的……比需要重命名数据库更糟糕的做法。

    【讨论】:

    • 但同义词表示表名而不是数据库名。我说的对吗?
    • 是的。您引用本地数据库中的同义词。该同义词指向一个对象,该对象可能在也可能不在另一个数据库中。您在同义词中定义数据库链接,而不是在引用同义词的存储过程中。请参阅上面的示例。
    • 否,但是在使用 db2 中的同义词时,我仍然需要使用 db1 名称,例如 select * from db1.dbo.synonym1。我想在这里避免使用 db1 名称本身。或者想使用一些可配置的名称而不是 db1。
    • 没有。您在 same 数据库中创建与存储过程相同的同义词。然后,当您引用它时,您不需要使用数据库名称对其进行限定。当您创建同义词时,that 是您对数据库名称进行硬编码的时候。无法避免对数据库名称进行硬编码,但您可以大大减少需要维护的对象数量。我想我的例子是错误的。我会澄清的。
    • 请提供参考链接或示例。我无法获得。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多