我的新客户端计划使用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
对象。
我怎样才能克服这一点?这有什么相同的吗?
答案 0 :(得分:3)
您需要在SQL脚本中删除对SQL登录名的检查,以便将dacpac部署到Azure SQL数据库。
这是因为在Azure SQL Server中,您只能检查主数据库中 sys.sql_logins 表中的SQL登录名。
此外,Azure SQL数据库也不支持引用另一个数据库,即使它们位于同一个Azure SQL Server中。
希望这有帮助。
答案 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 exist,SYS.SQL_Logins从sys.server_principals继承了所有列,再加上几个额外的列