我想通过调用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语句。使用新连接连接到其他数据库。”。
任何人都可以提供一些如何解决我的问题的建议,或者还有其他更优雅的解决方案?
提前谢谢!
答案 0 :(得分:2)
根据Microsoft,您必须分两步执行,因为不支持USE
语句:
需要注意的一点是,SQL Azure不允许使用USE Transact-SQL语句,这意味着您无法创建单个脚本来执行CREATE LOGIN和CREATE USER语句,因为这些语句需要在不同的语句上执行数据库。
请遵循您收到的消息中给出的建议。创建两个sql语句并使用不同的连接执行它们。
一个连接到主数据库并创建登录,另一个连接到特定数据库并创建用户。