创建用户和分配角色的游标
Cursor which create user and assign role
我有用户列表,所有这些用户都需要在使用域身份验证的服务器上,我有临时文件 table,其中 Ian 从 cab 文件加载我的用户。
我需要根据临时文件中的记录创建用户
游标如何创建这条记录?
我正在尝试
DECLARE cursor1 CURSOR
FOR
SELECT *
FROM #temp;
OPEN cursor1
FETCH NEXT
FROM cursor1
INTO @userprofile
WHILE @@fetch_status = 0
BEGIN
CREATE user @userprofile
FOR LOGIN @userprofile GO
EXEC sp_addrolemember 'role'
,@userprofile
FETCH NEXT
FROM cursor1
INTO @userprofile
END
CLOSE cursor1
DEALLOCATE cursor1
但是它给我一个错误
Msg 102 Incorrect syntax near @userprofile and msg 137 must declare the scalar variable @userprofile
您不能在调用 CREATE USER 等命令时使用内联变量作为对象名称。你需要做这样的事情并使用动态 sql 代替:
EDIT - 在此示例中,您也可以使用 sp_adduser 而不是动态 sql。但是,从 SQL Server 2012 开始,此存储过程已被弃用。因此,如果您使用上述版本,请坚持使用动态 sql 和 CREATE USER 命令。
动态 SQL 如果 SQL2012 年或更高版本
DECLARE @UserProfile VARCHAR(20)
DECLARE cursor1 CURSOR
FOR
SELECT
*
FROM #temp;
OPEN cursor1
FETCH NEXT FROM cursor1 INTO @UserProfile
WHILE @@Fetch_Status = 0
BEGIN
DECLARE @Sql VARCHAR(MAX)
SET @Sql = 'Create user ' + @UserProfile + ' for login ' + @UserProfile
--PRINT @SQL
EXEC (@Sql)
EXEC sp_addrolemember 'role'
,@UserProfile
FETCH NEXT FROM cursor1 INTO @UserProfile
END
CLOSE cursor1
DEALLOCATE cursor1
sp_adduser 如果之前:
EXEC sys.sp_adduser @LogInAme = @UserProfile
,@Name_In_Db = @UserProfile
我已经注释掉了 PRINT 语句。但是,如果您取消注释它。您可以从光标看到它正在创建的命令。
我有用户列表,所有这些用户都需要在使用域身份验证的服务器上,我有临时文件 table,其中 Ian 从 cab 文件加载我的用户。 我需要根据临时文件中的记录创建用户
游标如何创建这条记录?
我正在尝试
DECLARE cursor1 CURSOR
FOR
SELECT *
FROM #temp;
OPEN cursor1
FETCH NEXT
FROM cursor1
INTO @userprofile
WHILE @@fetch_status = 0
BEGIN
CREATE user @userprofile
FOR LOGIN @userprofile GO
EXEC sp_addrolemember 'role'
,@userprofile
FETCH NEXT
FROM cursor1
INTO @userprofile
END
CLOSE cursor1
DEALLOCATE cursor1
但是它给我一个错误
Msg 102 Incorrect syntax near @userprofile and msg 137 must declare the scalar variable @userprofile
您不能在调用 CREATE USER 等命令时使用内联变量作为对象名称。你需要做这样的事情并使用动态 sql 代替:
EDIT - 在此示例中,您也可以使用 sp_adduser 而不是动态 sql。但是,从 SQL Server 2012 开始,此存储过程已被弃用。因此,如果您使用上述版本,请坚持使用动态 sql 和 CREATE USER 命令。
动态 SQL 如果 SQL2012 年或更高版本
DECLARE @UserProfile VARCHAR(20)
DECLARE cursor1 CURSOR
FOR
SELECT
*
FROM #temp;
OPEN cursor1
FETCH NEXT FROM cursor1 INTO @UserProfile
WHILE @@Fetch_Status = 0
BEGIN
DECLARE @Sql VARCHAR(MAX)
SET @Sql = 'Create user ' + @UserProfile + ' for login ' + @UserProfile
--PRINT @SQL
EXEC (@Sql)
EXEC sp_addrolemember 'role'
,@UserProfile
FETCH NEXT FROM cursor1 INTO @UserProfile
END
CLOSE cursor1
DEALLOCATE cursor1
sp_adduser 如果之前:
EXEC sys.sp_adduser @LogInAme = @UserProfile
,@Name_In_Db = @UserProfile
我已经注释掉了 PRINT 语句。但是,如果您取消注释它。您可以从光标看到它正在创建的命令。