3

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

如果我们在环境之间移动数据库,这将允许我们自动设置权限(目前由于 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 文档确实说明了:

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

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

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

4

2 回答 2

2

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

Hth,奥利

于 2013-12-04T11:34:51.087 回答
1

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

于 2013-10-30T09:18:04.450 回答