sp_addrolemember sẽ thêm người dùng vào vai trò, nó sẽ không tự động tạo người dùng trong cơ sở dữ liệu.
Bạn có thể sử dụng SQL động để chạy giả định này, bạn có thể lập trình xác định cơ sở dữ liệu nơi người dùng cần được thêm vào.
Sau đây sẽ in mã để thêm một người dùng vào mọi cơ sở dữ liệu phi hệ thống trong trường hợp:
DECLARE @UserName SYSNAME;
DECLARE @cmd NVARCHAR(MAX);
SET @cmd = '';
SET @UserName = 'SomeUser';
DECLARE cur CURSOR LOCAL FORWARD_ONLY
FOR
SELECT 'USE ' + d.name + ';
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.database_principals dp
WHERE dp.name = ''' + @UserName + '''
)
BEGIN
CREATE USER ' + QUOTENAME(@UserName) + '
FROM LOGIN ' + QUOTENAME(@UserName) + '
WITH DEFAULT_SCHEMA = dbo;
END
EXEC sp_addrolemember @RoleName = ''db_datareader''
, @MemberName = ''' + @UserName + ''';
GO
'
FROM sys.databases d
WHERE d.database_id > 4 /* exclude system databases. Other criteria could
be used here */
OPEN cur;
FETCH NEXT FROM cur
INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT (@cmd);
FETCH NEXT FROM cur
INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
Tôi đã sử dụng một con trỏ ở đây để cá nhân PRINTtuyên bố cho từng cơ sở dữ liệu. Bạn sẽ cần phải tự tạo thông tin đăng nhập SomeUsertrước khi chạy mã này.