使用可变域用户登录创建用户脚本

时间:2015-01-20 12:03:14

标签: sql sql-server release release-management dacpac

我们有一个具有创建用户脚本的DACPAC。 用户具有需要设置为Windows域用户的登录 当我们为Test / Staging / Release进行构建时,我们需要为用户登录应用不同的域和用户。

我认为我们可能能够使用SQLCMD变量但是我在尝试使用时遇到SQL71501错误。该脚本看起来像这样:

CREATE USER [Username]
    For Login [$(SQLLoginDomain)]
    WITH DEFAULT_SCHEMA = [SCHEMANAME]
GO

3 个答案:

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