如何为数据库名称创建Sql Synonym或“别名”?

30

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

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

似乎SQL Server仅支持对视图、表、存储过程或函数进行同义词操作。而别名仅适用于表和列名。

是否有我在文档中忽略的方法? 有人有解决方法的建议吗?


2
在我们的情况下,我们需要进行数据库到数据库的调用;目标服务器根据测试与生产而异,我们不希望每次发布时都要记得更改所有引用。 - STW
4个回答

4
使用三部分符号和表别名,例如:
select * from tempdb.dbo.sysobjects a
join master.dbo.sysobjects b on a.id = b.id

我尝试了其中一个表格,效果非常好。但是,我认为我需要在新数据库中为原始数据库中的每个表、函数、视图和存储过程创建同义词?我有5或6个配置文件,所以我认为更改它们会减少开销。 - Kevin McKinley

2
有一种方法可以使用链接服务器来模拟这个过程。这假设您有两个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

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

1

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

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

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()函数即可。


好的想法,但是我使用的一些应用程序不是我的,我无法控制它们如何生成连接字符串(例如MS Reporting Services)。我刚刚更新了我的问题以反映这一点。 - Kevin McKinley
是的,这只有在你控制代码时才能起作用。祝你好运找到答案,如果你找到了,请在这里发布回复。 - Ryan Ahearn

0

我知道这可能不适用于所有情况,但您仍然可以使用视图选项。只要它具有适当的标识键(主键),您就可以将其插入、删除、更新、选择到视图中。如果将其指向另一个数据库,应该删除并重新创建以获取不同的模式(在测试和/或生产中更改模式时工作)。

当您要转到另一个数据库并具有3或4个部分名称时,同义词非常有用,但是当您想要使其具有固定名称时,链接服务器也可以工作,这将使您可以使用固定名称,如果表名在两个数据库中相同,并且您只是在生产和测试之间进行指向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接