我正在使用MSSQL 2014,我在完成DB管理员关于安全性的一个请求时遇到了麻烦。 我们的解决方案包含多个数据库(在同一服务器上),其中存储过程在两个或多个数据库的表之间具有连接。我们有一个用户对所有数据库拥有相同的权限。 非常简单的示例:一个数据库包含文章而另一个包含价格,查询需要获取文章及其价格。查询在这两个数据库的表之间有INNER JOIN-。
在我们客户的测试环境中部署解决方案后,我与客户的数据库管理员进行了交谈,他要求我修改数据库和用户以符合他们的一些标准。这些标准包括不同环境中的不同数据库名称以及每个数据库一个单独的用户。
如果我在当前解决方案中更改了数据库名称和用户,则由于数据库名称无效或凭据无效,存储过程将返回错误。我问管理员他们是如何在他们的环境中解决这个问题的,他的回答是他们创建了数据库链接。在谷歌搜索解决方案之后,我发现Oracle有CREATE DATABASE LINK选项,但MSSQL中没有类似的东西(除了可能的链接服务器功能,但这并不能解决我的问题)。
我正在寻找的东西类似于Oracle在MSSQL 2014中的CREATE DATABASE LINK,这个解决方案允许执行存储过程而无需更改查询,而是创建'别名&# 39;需要重命名的数据库。
有没有人知道我该怎么做?
答案 0 :(得分:0)
答案 1 :(得分:0)
不确定这是否可以作为答案,但是它太长而无法发表评论...
你的问题中没有技术细节,所以我做了一个巨大的疯狂的猜测但是使用许多schema而不是许多数据库可能会避免这个问题。 /> 这样,所有对象都属于同一个数据库,不需要进行跨数据库调用 显然这个解决方案可能不适合你的情况,因为[你在这里列出很长的理由]而不适用,并且还需要修改其影响无法估计读取SO上的帖子... ^^
作为旁注客户并不总是正确的;如果他们的策略依赖于特定的oracle功能,他们就不能期望在缺少该功能的不同rdbms上强制执行相同的策略。
实际上他们可能会这样做,但你的工作是教育'他们(或至少尝试!)。
无论如何,如果该政策是强制性的,那么他们将很乐意支付所需的额外费用,不是吗?
答案 2 :(得分:0)
从显而易见的开始我认为你应该向客户解释说,虽然有多个物理数据库,但事实上同一个产品分开并使用的数据库完全相同。明确表示不应将其视为标准中的违规行为。
如果你无法说服他们那么你必须处理两个问题:不同的用户/登录和不同的数据库名称。
不同的用户/登录:您可以使用linked server解决此问题。链接服务器不仅适用于不同的服务器或不同的实例,您可以创建一个使用不同登录的“本地”链接服务器。
EXEC sp_addlinkedserver
@server='yourAlias',
@srvproduct='SQL_SERVER',
@provider='yourServer\yourInstance',
@dataSrc = 'yourDatabaseXYZ'
GO
您可以轻松修改刚刚创建的链接服务器使用的凭据:
不同的数据库名称:我能想到的唯一解决方案是为数据库中的每个对象创建一个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也提到的那样,你应该考虑不在应用程序中硬编码数据库名称。