有没有办法在sql server中将数据库名称设置为全局名称?

时间:2016-11-24 12:52:35

标签: c# sql-server database

我有两个数据库,如下所述:

  • [QCR_DEV]
  • [QCR_DEV_LOG]

所有申请数据都存储在 [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]数据库中。我需要从两个数据库中获取数据。为此,我需要在查询中提到数据库名称。我不想要这个。有没有办法全局设置数据库名称并在我的查询中使用此名称,以便在将来我需要更改数据库名称时,我只会从全局设置的位置更改。有没有办法做到这一点?

2 个答案:

答案 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