我有两个数据库的情况:
- ABC数据
- ABC用户
ABCData 中的一个存储过程需要对 ABCUsers 中的表执行插入操作。这可能只是硬编码:
INSERT ABCUsers.dbo.Table1 VALUES('a');
但是我们遇到的下一个问题是我们想要备份这些数据库对并将其重新部署到具有类似名称的其他数据库,以用于测试和开发目的:
- XYZ数据
- XYZ用户
这意味着 XYZData 数据库将包含一个不起作用的 sproc - 因为插入有一个硬编码ABCUsers.dbo.Table1
,我们不想改变它
我们可以在存储过程中找到当前数据库名称,调整它并动态运行sql:
DECLARE @DataDbName sysname = (DB_NAME());
DECLARE @UserDBName NVARCHAR(20) = (SELECT REPLACE(@DataDbName, 'Data', 'Users'));
EXEC CONCAT('INSERT ', @UserDbName, '.dbo.Table1 VALUES(''a'');')
但我认为这样做的前景实际上让我感到身体不适;)(尤其是因为这是一个大量简化的示例,每个存储过程都对其他数据库进行数十次调用)
有没有办法在创建过程中为数据库名称起别名,这样 sproc 总是可以这样说:
INSERT UserDbAlias.dbo.Table1 VALUES('a');
并且在ABCUsers
创建数据库时,UserDbAlias -> ABCUsers
但是在XYZUsers
创建数据库时UserDbAlias -> XYZUsers
或者,这是一个 git/tfs 源代码控制——有没有办法编写 sproc 的源代码控制版本,以便在部署时动态修改它,并且原始源可以包含某种 db 名称的占位符,但是它们在部署时被实际硬编码的不同数据库名称替换(自动)
脚注:我查看了A way to reference other DB without hardcoding its name这似乎确实描述了我的问题,但没有答案。该问题提到“我看过同义词,但它们不适用于 EF6 ..”(释义)
同义词对我有用吗?我们使用 EF6,但我不确定实际问题是什么,为什么它无法解决。我们在数据库中的 sproc 名称永远不会改变,我们不需要为 sproc 本身起别名,它是我们需要别名的插入表名称。如果 sproc 总是被调用Sproc1
,无论它是 inABCData
还是XYZData
,并且同义词解析发生在 sproc 内部,EF6 甚至会有问题吗?
除了评论中提出的设计考虑外,...
在创建存储过程之前考虑一个间接级别:
INSERT DBNAMETOKEN.dbo.Table1 VALUES('a');
好处