如何检查 Azure SQL 数据库中是否已存在数据库用户

Mah*_*V S 4 t-sql sql-server azure dacpac azure-sql-database

我的新客户计划使用 Azure 托管 SQL 数据库服务。我正在使用 dacpac 来部署数据库。在 dacpac 中,我有一个部署后脚本来创建一个 sql 用户,如下所示

IF NOT EXISTS (SELECT name
               FROM   sys.server_principals
               WHERE  name = 'myusername')
    BEGIN
        CREATE LOGIN myusername
            WITH PASSWORD = '******';
    END
GO
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在 Azure(使用目标平台 - Microsoft Azure SQL 数据库 V12 编译)中应用 dacpac 时,它会引发以下错误。

An error occurred while the batch was being executed.
Updating database (Failed)
*** Could not deploy package.
Error SQL72014: .Net SqlClient Data Provider: Msg 208, Level 16, State 1, Line 4 Invalid object name 'sys.server_principals'.
Error SQL72045: Script execution error.  The executed script:
Run Code Online (Sandbox Code Playgroud)

从消息看来,我不能依赖该sys.server_principals对象。

我怎样才能克服这个问题?这有什么等价物吗?

jro*_*llo 8

查看包含的数据库用户模型 ( https://msdn.microsoft.com/en-us/library/ff929188.aspx )。

在包含的数据库用户模型中,主数据库中的登录名不存在。相反,身份验证过程发生在用户数据库中,用户数据库中的数据库用户在主数据库中没有关联的登录名。

IF NOT EXISTS (
    SELECT  [name]
    FROM    sys.database_principals
    WHERE   [name] = 'myusername'
)
BEGIN
    CREATE USER [myusername] WITH PASSWORD = '********';
END
Run Code Online (Sandbox Code Playgroud)


juv*_*han 5

您需要在 SQL 脚本中删除对 SQL 登录名的检查,以将 dacpac 部署到 Azure SQL 数据库。

这是因为在 Azure SQL Server 中,您只能检查master数据库的sys.sql_logins表中的 SQL 登录名。

此外,Azure SQL 数据库也不支持引用其他数据库,即使它们位于同一 Azure SQL Server 中。

希望这可以帮助。

在此输入图像描述