【问题标题】:MSSQL - Create an alias name for a databaseMSSQL - 为数据库创建别名
【发布时间】:2014-11-06 13:02:44
【问题描述】:

我正在使用 MSSQL 2014,但在满足数据库管理员关于安全性的一项请求时遇到了麻烦。 我们的解决方案包含多个数据库(在同一台服务器上),其中包含两个或多个数据库的表之间的连接的存储过程。我们有一个用户对所有数据库拥有相同的权限。 非常简单的例子:一个数据库包含文章,而另一个包含价格,查询需要获取文章及其价格。查询在这两个数据库中的表之间具有 INNER JOIN-s。

在我们客户的测试环境中部署解决方案后,我与客户的数据库管理员交谈,他要求我修改数据库和用户以符合他们的一些标准。这些标准包括不同环境中的不同数据库名称以及每个数据库一个单独的用户。

如果我在当前解决方案中确实更改了数据库名称和用户,存储过程将由于无效的数据库名称或无效的凭据而返回错误。我问那个管理员他们是如何在他们的环境中解决这样的问题的,他的回答是他们创建了数据库链接。在谷歌搜索解决方案后,我发现 Oracle 有 CREATE DATABASE LINK 选项,但在 MSSQL 中没有类似的东西(除了链接服务器功能,但这并不能解决我的问题)。

我正在寻找的是类似于 Oracle 在 MSSQL 2014 中的 CREATE DATABASE LINK 的解决方案,它允许执行存储过程而无需更改查询,而是创建需要的数据库的“别名”改名了。

有人知道我该怎么做吗?

【问题讨论】:

  • 是客户,但数据库名称如何构成安全问题?
  • 您在寻找this吗?
  • @TabAlleman 我会更详细地检查同义词,但我似乎无法为连接指定凭据。
  • @ForguesR 数据库在同一台服务器上,链接服务器无法完成这项工作......
  • @Blam 数据库名称不是安全问题,而是一个标准 - 他们有很多环境,数据库命名对他们来说很重要。

标签: sql-server database oracle


【解决方案1】:

我刚刚搜索了msdn

CREATE SYNONYM (Transact-SQL)

我知道只有链接的答案不受欢迎,但这就是答案,msdn 不会消失

【讨论】:

  • 我稍微分析了 CREATE SYNONYM 命令,我看到它只能用于为数据库对象创建同义词,而不是为整个数据库本身创建同义词。在这种情况下,这需要创建很多同义词......
  • 好的,我将保留它,以便人们知道它不起作用。当你有一个接受的答案时,我会删除它。以后我建议您不要在应用程序中对数据库名称进行硬编码。只需将数据库名称分配给一个变量即可。
【解决方案2】:

不确定这是否可以作为答案,但是太长了,无法发表评论...

您的问题中没有技术细节,所以我做出了一个巨大的疯狂猜测,但也许可以使用许多 schema 而不是许多数据库来避免这个问题。
这样您的所有对象都将属于同一个数据库,并且无需进行跨数据库调用。
显然,此解决方案可能不适合您的情况,由于 [您在此处列出一长串原因] 不适用,并且还需要更改其影响无法估计阅读 SO 上的帖子... ^^

作为旁注客户并不总是正确的;如果他们的策略依赖于特定的 oracle 功能,他们就不能期望在缺少该功能的不同 rdbms 上强制执行相同的策略。
实际上,他们可能希望这样做,但您的工作是“教育”他们(或至少尝试这样做!)。

无论如何,如果该政策是强制性的,那么他们会很乐意为遵守所需的额外努力付出代价,不是吗?

【讨论】:

  • 我考虑过使用模式,但正如你提到的,它不适用的原因有一长串:) 我想我必须说服他们在我们的案例中例外,因为它在我看来,这没有简单的解决方案。
【解决方案3】:

从显而易见的开始,我认为您应该向客户解释,尽管有多个物理数据库,但实际上是同一个数据库分开并由同一个产品使用。明确表示这不应被视为违反其标准。

如果你不能说服他们,那么你必须处理两个问题:不同的用户/登录名和不同的数据库名称。

不同的用户/登录名:您可以使用linked server 解决此问题。链接服务器不仅适用于不同的服务器或不同的实例,您还可以创建一个“本地”链接服务器来使用不同的登录名。

EXEC sp_addlinkedserver
@server='yourAlias',
@srvproduct='SQL_SERVER',
@provider='yourServer\yourInstance',
@dataSrc = 'yourDatabaseXYZ'
GO

您可以轻松修改刚刚创建的链接服务器使用的凭据:

  1. 在 SQL Server Management Studio 中,打开对象资源管理器,展开服务器对象并右键单击刚刚创建的新链接服务器;
  2. 在“安全”页面上指定您要使用的登录名。

不同的数据库名称:我能想到的唯一解决方案是为数据库中的每个对象创建一个SYNONYM。这是其他人似乎以前做过的事情,虽然这不是什么有趣的事情,但似乎非常可行。您可以查看here 以获得完整的解决方案。

当然,您可以在链接服务器资源上使用SYNONYM。类似的东西:

CREATE SYNONYM yourTable FOR [yourAlias].yourDatabaseXYZ.schemaABC.yourTable

然后你就可以做到了:

-- Transparent usage of a table from another database with different credentials
SELECT * FROM yourTable; 

顺便说一句,有一个功能请求向 Microsoft 发送到 Allow CREATE SYNONYM for database。也许你想投票赞成它

最后说明:

为了避免这样的问题,就像 Blam 也提到的那样,您应该考虑不在您的应用程序中硬编码数据库名称。

【讨论】:

  • 谢谢,如果我按照您的描述实现链接服务器可能会有所帮助,但是我想避免为数据库中的每个对象创建同义词。我将尝试说服他们按照@Paolo 的建议更改 MS SQL 数据库项目的标准。如果他们拒绝,我想我将不得不处理同义词和链接服务器。
  • 祝你好运说服他们。如果您必须为所有对象创建同义词,我提供的完整解决方案链接可能会对您有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2015-10-11
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2014-05-23
相关资源
最近更新 更多