【问题标题】:CREATE USER in Dynamic SQL on SQL Azure在 SQL Azure 上的动态 SQL 中创建用户
【发布时间】:2013-11-04 09:04:19
【问题描述】:

我想编写一个存储过程来检查数据库所在的环境(基于名称)并为我们的应用程序创建适当的用户和角色。

如果我们在环境之间移动数据库,这将允许我们自动设置权限(目前由于 Windows Azure SQL 数据库的限制,我们必须手动运行一个不理想且容易出现人为错误的脚本)。

所以我们使用的语法是:

DECLARE @UserToAdd VARCHAR(50) = (
    SELECT  CASE 
            WHEN @Environment = 'Development' THEN 'DevelopmentApplicationUser'
            WHEN @Environment = 'Test' THEN 'TestingApplicationUser'
            ELSE ''
        END
)

IF (@UserToAdd != '')
BEGIN
    EXEC ('CREATE USER [' + @UserToAdd + '] FOR LOGIN [' + @UserToAdd + '];')

    EXEC ('EXEC sp_addrolemember N''WebUser'', N''' + @UserToAdd + ''';')
END

这在我们的开发服务器 (SQL Server 2008 R2) 上正常工作,但在 Windows Azure SQL 数据库中我们得到以下错误:

CREATE USER 语句必须是批处理中的唯一语句

现在MSDN documentation 声明:

如果 CREATE USER 语句是 SQL 批处理中的唯一语句,则 Windows Azure SQL 数据库支持 FOR | FROM LOGIN 子句。如果 CREATE USER 语句不是 SQL 批处理中的唯一语句或在动态 SQL 中执行,则 FOR |不支持 FROM LOGIN 子句。

然而,这意味着我们无法自动化我们的权限。

有没有人解决这个问题并能够生成创建用户的动态 sql?或者在存储过程中有没有办法解决这个问题?

【问题讨论】:

  • 作为注释; ALTER USER 也会出现同样的问题。您可以运行 CREATE USER [x] WITHOUT LOGINALTER USER 不会让您将其重新绑定到登录

标签: sql azure permissions azure-sql-database


【解决方案1】:

我在这里说的有待纠正。 您可以在没有 FOR LOGIN 的情况下创建用户 然后在事后使用 sp_change_users_login 将用户映射到登录

【讨论】:

  • 谢谢@Maxui;这将在标准 SQL Server 实例上完美运行,但是我刚刚尝试过sp_change_users_login,它似乎在 Windows Azure SQL 数据库上不受支持。糟糕的时光正是我们所需要的
【解决方案2】:

我向 Microsoft 打开了一个支持案例,看看这是否可行,得到的答复是,如果您想检查登录名或用户是否存在,然后创建该登录名或用户,则必须使用单独的连接进行检查然后是创作。如果在同一事务或批次中不存在,则无法检查和创建。在 Sql Azure 中。

第, 奥利

【讨论】:

  • 谢谢奥利;因此我们可以编写一个自定义 C# 程序或 SSIS 包,使用 2 个单独的批次为我们执行此操作,但我们无法执行与存储过程相同的逻辑。
  • 没错。我使用 powershell 来做到这一点。
猜你喜欢
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2013-11-01
  • 2012-09-20
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多