【问题标题】:How to create Sql Synonym or "Alias" for Database Name?如何为数据库名称创建 Sql 同义词或“别名”?
【发布时间】:2010-10-01 10:38:37
【问题描述】:

我正在使用 ms sql 2008 并尝试创建一个引用另一个数据库的数据库名称。例如,“Dev”、“Test”、“Demo”是我可以从多个配置文件中引用的数据库名称,但每个名称都指向另一个数据库,例如“db20080101”或“db20080114”。

[编辑]一些配置用于我控制代码的应用程序,而另一些则不是(例如 MS Reporting 服务数据源文件配置)[/Edit]

sqlserver 似乎只支持 View、Table、Sproc 或 Function 的同义词。 Alias' 用于表名和列名。

有没有一种我在文档中遗漏的方法? 有人对解决方法有任何建议吗?

【问题讨论】:

  • +1。在我们的例子中,我们必须进行 DB-to-DB 调用;目标服务器因测试与生产而异,我们不想总是记住在每个版本中更改所有引用

标签: sql sql-server-2008 alias synonym


【解决方案1】:

在表格中使用 3 部分符号和别名,示例

select * from tempdb.dbo.sysobjects a
join master.dbo.sysobjects b on a.id = b.id

【讨论】:

  • 我在其中一张桌子上试过这个,效果很好。但是,我相信我必须在新数据库中为原始数据库中的每个表、函数、视图和存储过程创建一个同义词?我有 5 或 6 个配置文件,所以我认为更改它们会减少开销。
【解决方案2】:

我使用另一个配置文件做了类似的事情。

新的配置文件将您的通用名称映射到连接到该数据库所需的所有信息(数据库名称、用户名、密码等),然后您的连接函数将您的通用名称作为参数。

db.config:

DEV_DB_NAME = db20080101
DEV_DB_USER = dev_user
DEV_DB_PASS = dev_pass
TEST_DB_NAME = db20070101
TEST_DB_USER = test_user
TEST_DB_PASS = test_pass

连接代码:

db_connection get_connection(string prefix) {
    db_connection db_conn = new db_connection;
    string db_name = get_config_value(config_path, prefix + "_DB_NAME");
    string db_user = get_config_value(config_path, prefix + "_DB_USER");
    string db_pass = get_config_value(config_path, prefix + "_DB_PASS");

    db_conn.connect(db_name, db_user, db_pass);

    return db_conn;
}

然后你只需调用 get_connection() 并使用你的 db 别名作为参数。

【讨论】:

  • 好主意,但一些正在使用的应用程序不是我的,我无法控制它们如何生成连接字符串(即 MS Reporting Services)。我刚刚更新了我的问题以反映这一点。
  • 是的,这仅在您控制代码时才有效。祝你好运找到你的答案,如果/当你这样做时,把它发回这里。
【解决方案3】:

有一种方法可以使用链接服务器来模拟这种情况。这假设您有两台 SQL 服务器,它们具有相同的数据库集,一个用于开发/测试,一个用于实时运行。

  1. 在您的开发/测试服务器上打开 SQL Server Management Studio
  2. 右键单击服务器对象>链接服务器
  3. 选择新的链接服务器...
  4. 选择常规页面
  5. 在链接服务器字段中指定别名名称 - 这通常是您的实时服务器的名称
  6. 选择 SQL Native Client 作为提供者
  7. 输入 sql_server 作为产品名称
  8. 在数据源中指定开发服务器的名称
  9. 添加安全和服务器选项以供品尝
  10. 点击确定

以上适用于 SQL Server 2005,但对于 2008 应该类似

完成后,您可以像这样编写 SQL:

SELECT * FROM liveservername.databasename.dbo.tablename

现在,当您的脚本在开发服务器上运行并且链接服务器返回到自身时,它们将正确地从开发服务器中提取数据,并且当完全相同的脚本在实时服务器上运行时,它们将正常工作。

【讨论】:

    【解决方案4】:

    我知道这可能不会在所有情况下都有帮助,但您仍然可以选择使用视图。您可以在视图中插入、删除、更新、选择,只要它具有正确的标识键(主键)。如果将其指向另一个数据库,则应删除并重新创建以获取不同的架构(以防您在生产和测试之间工作,同时在测试和/或生产中更改架构。

    当您要去另一个数据库并拥有 3 或 4 个部分的名称时,同义词很有用,但是当您想创建它以便拥有一个集合名称时,链接服务器也可以工作,它可以让您使用如果两个数据库中的表名相同并且您只是在 prod 和 test 之间指向,则为固定名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-07
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多