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

时间:2016-10-21 09:49:29

标签: sql-server tsql azure azure-sql-database dacpac

我的新客户端计划使用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

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

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:

从消息中我似乎无法依赖sys.server_principals对象。

我怎样才能克服这一点?这有什么相同的吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

希望这有帮助。

enter image description here

答案 1 :(得分:2)

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

  

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

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

答案 2 :(得分:0)

IF NOT EXISTS (SELECT name
               FROM   sys.sql_logins 
               WHERE  name = 'myusername')
    BEGIN
        CREATE LOGIN myusername
            WITH PASSWORD = '******';
    END
GO
SQLAzure中的

sys.server_principals doesn't existSYS.SQL_Logins从sys.server_principals继承了所有列,再加上几个额外的列