我想编写一个存储过程来检查数据库所在的环境(基于名称)并为我们的应用程序创建适当的用户和角色。
如果我们在环境之间移动数据库,这将允许我们自动设置权限(目前由于 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?或者在存储过程中有没有办法解决这个问题?