我有几个使用相同程序和功能的数据库。每次我们对过程或函数的逻辑进行更改时,我都不希望将所有更改传播到每个数据库。
我认为最好的主意是建立一个同义词。但是,当我最初尝试时,它看起来像调用同义词导致在函数所在的服务器上调用的函数。我怎样才能查询本地数据?
以下是一个例子:
SELECT DB_2.dbo.ADD_FIVE('someid')
我的目标是当我打电话时
class Piece{
int width;
int height;
}
编辑:我想从DB_2(调用上下文)中获取结果,但似乎我只能从DB_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.MyTable
。 MyServer
将是开发环境中MyDevServer
的同义词,以及生产环境中的MyProdServer
。
我不推荐这个,但是如果你想拥有一个代码的地方,也许它应该在App本身。将T-SQL代码存储在数据库本身中有很多好处,尤其是对于不同的数据库,您可能有几个不同的版本,而不需要调用代码来理解差异。
如果您确实必须可以从任何数据库上下文调用代码而不使代码实际驻留在该数据库中,则需要在master
数据库中的存储过程内创建代码。存储过程名称必须以sp_
开头,并且必须使用sys.sp_MS_marksystemobject
将过程标记为系统过程。