我们有一个具有创建用户脚本的DACPAC。 用户具有需要设置为Windows域用户的登录 当我们为Test / Staging / Release进行构建时,我们需要为用户登录应用不同的域和用户。
我认为我们可能能够使用SQLCMD变量但是我在尝试使用时遇到SQL71501错误。该脚本看起来像这样:
CREATE USER [Username]
For Login [$(SQLLoginDomain)]
WITH DEFAULT_SCHEMA = [SCHEMANAME]
GO
答案 0 :(得分:1)
我基于痛苦经验的建议是保留SQL Server数据库项目中特定于环境的任何内容。相反,在部署DACPAC之后,将任何特定于环境的内容(permisins等)应用为单独的T-SQL脚本。如果您使用版本管理执行此操作,我会有一个汤匙到坚果的博客系列,其中包括发布DACPAC和单独的权限脚本here。有关应用标记化权限脚本的帖子是here。
答案 1 :(得分:1)
我们最终通过在dacpac中使用后期部署脚本解决了这个问题,只要您在尝试调用用户以查看它们是否已经存在之前进行检查,那么一切正常,因为这是您可以使用它们的唯一地方禁止预部署脚本。
答案 2 :(得分:0)
您可以从sys.dm_exec_sessions系统视图中读取Windows域。
例如,您可以在DACPAC的部署后脚本中添加类似的内容......
DECLARE @host_name nvarchar(128);
DECLARE @nt_domain nvarchar(128);
SELECT
@host_name = host_name,
@nt_domain = nt_domain
FROM
sys.dm_exec_sessions
WHERE
session_id = @@SPID;
-- If the domain is present, setup the login/user.
-- Otherwise, we are probably running under test environment, so we can skip this.
-- `@nt_domain = @host_name` tends to hold for LocalDB.
IF @nt_domain IS NOT NULL AND @nt_domain <> @host_name BEGIN
DECLARE @user_nonquoted nvarchar(128) = @nt_domain + '\YourUserName';
DECLARE @user nvarchar(128) = QUOTENAME(@user_nonquoted);
IF @user_nonquoted NOT IN (SELECT name FROM sys.database_principals)
EXEC ('CREATE LOGIN ' + @user + ' FROM WINDOWS');
IF @user_nonquoted NOT IN (SELECT name FROM sys.server_principals)
EXEC ('CREATE USER ' + @user + ' FOR LOGIN ' + @user);
END