Azure SQL如何按过程创建数据库用户?

时间:2017-06-10 06:14:44

标签: tsql azure stored-procedures azure-sql-database

我想通过调用webapi从客户端应用程序注册新用户,其中dapper将执行过程以创建新的db用户并在表中存储凭据(无密码)。注册后,我将使用用户凭据更改连接字符串以登录。

是否可以通过在Azure sql db上执行存储过程来动态创建数据库用户?

我提出了这样的问题:

CREATE PROCEDURE [dbo].[AddDbUser]
@Login nvarchar(50), 
@Password nvarchar(50),
@Mail nvarchar(70),
@Phone nvarchar(9),
@SQL nvarchar(1000)
AS
BEGIN

SET @SQL = 'USE [testdb] '
    + 'CREATE LOGIN '+quotename(@Login)+' WITH PASSWORD = 
    '+quotename(@Password,'''')+'; '
    + 'CREATE USER '+@Login +'; '
    + 'EXEC [sys].[sp_addrolemember] ''db_datareader'', '+@Login+'; '
    + 'EXEC [sys].[sp_addrolemember] ''db_datawriter'', '+@Login+'; '
    + 'GRANT EXECUTE ON SCHEMA :: [dbo] TO '+@Login+'; '

    + 'INSERT INTO [dbo].[Users] (Login, Mail, Phone) '
    + 'VALUES ('+quotename(@Login,'''')+', '+quotename(@Mail,'''')+', 
    '+quotename(@Phone,'''')+');'

EXEC (@SQL)
END
GO

exec [dbo].[AddDbUser] 'dawidtest', 'password', 'mail@mail.pl', '123123123', null会收到消息:“用户必须在主数据库中。”,但是当我添加USE [master]而不是USE [testdb]时,我收到消息: “不支持在数据库之间切换USE语句。使用新连接连接到其他数据库。”

任何人都可以提供一些如何解决我的问题的建议,或者还有其他更优雅的解决方案?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

根据Microsoft,您必须分两步执行,因为不支持USE语句:

  

需要注意的一点是,SQL Azure不允许使用USE Transact-SQL语句,这意味着您无法创建单个脚本来执行CREATE LOGIN和CREATE USER语句,因为这些语句需要在不同的语句上执行数据库。

请遵循您收到的消息中给出的建议。创建两个sql语句并使用不同的连接执行它们。

一个连接到主数据库并创建登录,另一个连接到特定数据库并创建用户。