我有两个数据库,如下所述:
所有申请数据都存储在 [QCR_DEV] 中。在 [QCR_DEV] 的每个表格上,有一个触发器可将 [QCR_DEV] 表的插入和更新详细信息插入 [QCR_DEV_LOG] 数据库。
假设我在 [QCR_DEV] 数据库中有一个表 [party] 。每当我插入,更新或删除表中的一些记录。表格 [party_log] 中会有一个插入位于 [QCR_DEV_LOG] 数据库中。简而言之,我将 [QCR_DEV] 表格上的日志或操作保存到 [QCR_DEV_LOG] 数据库。
当我们通过应用程序连接到数据库时,它使用连接字符串以某种方式连接到数据库。在我的存储过程中,我没有使用数据库名称,如:
Select * From [QCR_DEV].[party];
我这样使用:
Select * From [party];
这是因为,如果我需要更改数据库名称,那么我只需要更改连接字符串。
现在谈到这一点,我需要从[QCR_DEV_LOG]数据库中获取数据。我正在编写一个存储过程,我需要从两个数据库中获取数据,如:
Select * From [QCR_DEV_LOG][party_log]
INNER JOIN [person] on [person].person_id = [QCR_DEV_LOG][party_log].person_id
where party_id = 1
此存储过程位于[QCR_DEV]数据库中。我需要从两个数据库中获取数据。为此,我需要在查询中提到数据库名称。我不想要这个。有没有办法全局设置数据库名称并在我的查询中使用此名称,以便在将来我需要更改数据库名称时,我只会从全局设置的位置更改。有没有办法做到这一点?
答案 0 :(得分:6)
我会第二次Jeroen Mostert发表评论并使用同义词:
CREATE SYNONYM [party_log] FOR [QCR_DEV_LOG].[dbo].[party_log];
重命名目标数据库时,此查询将生成迁移脚本:
SELECT 'DROP SYNONYM [' + name + ']; CREATE SYNONYM [' + name + '] FOR ' + REPLACE(base_object_name, '[OldLogDbName].', '[NewLogDbName].') + ';'
FROM sys.synonyms
WHERE base_object_name LIKE '[OldLogDbName].%';
答案 1 :(得分:5)
您可以在DEV数据库中执行此操作:
CREATE VIEW [dbo].[party_log]
AS
SELECT * FROM [QCR_DEV_LOG].[dbo].[party_log]
然后,您可以编写SELECT-queries,就好像DEV数据库中存在[party_log]
表一样。
在执行合并查询之前,应该应用任何WHERE..
或JOIN..ON..
子句。
如果LOG数据库被移动或重命名,那么您只需更新视图(或几个视图,但可能永远不会更新)。
如果您希望定期更改,或者您需要在多台服务器上使用它,那么您可以使用动态SQL:
IF OBJECT_ID('[dbo].[party_log]') IS NOT NULL DROP VIEW [dbo].[party_log]
-- etc, repeat to DROP other views
DECLARE @logdb VARCHAR(80) = 'QCR_DEV_LOG'
EXEC ('CREATE VIEW [dbo].[party_log] AS SELECT * FROM [' + @logdb + '].[dbo][party_log]')
-- etc, repeat to create other views