我想知道是否可以制作一个简单而又快速的T-SQL脚本来编辑数据库以创建用户,这对于不同的人来说是有效的。我的示例将意味着每次循环遍历一个获得不同值的变量。
例如,我希望以下内容:
这是一个示例脚本,如果我要添加1个用户,则可以使用,但是我想使用此简化版本或类似版本添加多个用户,因此人们只需要在1个区域中添加一个名称列表? >
USE DBNAME1
GO
Declare @User NVARCHAR (30) = 'Domain\Username1', 'Domain\Username2', 'Domain\Username3' etc.
Declare @CMD NVARCHAR (90) = 'CREATE USER "' + @User +'" FOR LOGIN "' + @User + '"'
Declare @CMD2 NVARCHAR (90) ='ALTER ROLE [db_owner] ADD MEMBER [' + @User + ']'
if not exists(select name from sys.database_principals where name = @User)
Begin exec(@cmd) exec(@cmd2) End
ELSE
Begin Print '['+ @User +'] Exists' END
上面的内容给出了以下错误:
第15层,状态1,第3行,消息102
“ domain \ Username2”附近的语法不正确。
第137条消息,第2级,第5行,第5行
必须声明标量变量“ @User”。
第137条消息,状态2,第6行,第6行
必须声明标量变量“ @User”。
第137条消息,第2级,第8行,第8行
必须声明标量变量“ @User”。
第13级州立2行9的消息137
必须声明标量变量“ @cmd”。
第13级州立2行9的消息137
必须声明标量变量“ @ cmd2”。
第13级州立2行11的消息137
必须声明标量变量“ @User”。
是否有可能做到这一点,因为它会使事情变得更好用?
答案 0 :(得分:2)
您可以使用表变量来存储用户名。
DECLARE @Users TABLE(Username VARCHAR(64))
INSERT INTO @Users(Username) VALUES('Domain\Username1')
INSERT INTO @Users(Username) VALUES('Domain\Username2')
DECLARE @Username AS VARCHAR(64)
DECLARE C_Users CURSOR FOR
SELECT Username FROM @Users
OPEN C_Users
FETCH NEXT FROM C_Users INTO @Username
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS(SELECT name FROM sys.database_principals WHERE name = @Username)
BEGIN
EXEC('CREATE USER [' + @Username + '] FOR LOGIN [' + @Username + ']')
EXEC('ALTER ROLE [db_owner] ADD MEMBER [' + @Username + ']')
PRINT '['+ @Username +'] created'
END
ELSE
BEGIN
PRINT '['+ @Username +'] already exists'
END
FETCH NEXT FROM C_Users INTO @Username
END
CLOSE C_Users
DEALLOCATE C_Users