SQL Server本地和远程服务器的同义词

时间:2016-01-06 18:00:39

标签: sql-server synonym

我有几个使用相同程序和功能的数据库。每次我们对过程或函数的逻辑进行更改时,我都不希望将所有更改传播到每个数据库。

我认为最好的主意是建立一个同义词。但是,当我最初尝试时,它看起来像调用同义词导致在函数所在的服务器上调用的函数。我怎样才能查询本地数据?

以下是一个例子:

SELECT DB_2.dbo.ADD_FIVE('someid') 

我的目标是当我打电话时

class Piece{
  int width;
  int height;
}

编辑:我想从DB_2(调用上下文)中获取结果,但似乎我只能从DB_1获得结果,其中定义了实际函数。

谢谢!

1 个答案:

答案 0 :(得分:2)

来自CREATE SYNONYM的{​​{3}}:

USE tempdb;
GO
-- Create a synonym for the Product table in AdventureWorks2012.
CREATE SYNONYM MyProduct
FOR AdventureWorks2012.Production.Product;
GO

-- Query the Product table by using the synonym.
USE tempdb;
GO
SELECT ProductID, Name 
FROM MyProduct
WHERE ProductID < 5;
GO

上面的示例允许您从实际在tempdb中运行的AdventureWorks2012上下文中执行代码。

您的代码完全按预期工作。当您运行SELECT DB_2.dbo.ADD_FIVE('someid')时,DB_1

返回结果

同义词通常用于提取数据库的名称或服务器的名称。因此,在部署到生产时,不必引用SELECT * from MyDevServer.dbo.MyTable并且必须将其更改为SELECT * from MyProdServer.dbo.MyTable,而是在两个服务器上设置同义词,使select语句变为SELECT * from MyServer.dbo.MyTableMyServer将是开发环境中MyDevServer的同义词,以及生产环境中的MyProdServer

我不推荐这个,但是如果你想拥有一个代码的地方,也许它应该在App本身。将T-SQL代码存储在数据库本身中有很多好处,尤其是对于不同的数据库,您可能有几个不同的版本,而不需要调用代码来理解差异。

如果您确实必须可以从任何数据库上下文调用代码而不使代码实际驻留在该数据库中,则需要在master数据库中的存储过程内创建代码。存储过程名称必须以sp_开头,并且必须使用sys.sp_MS_marksystemobject将过程标记为系统过程。