Thêm người dùng vào nhiều cơ sở dữ liệu


7

Tôi có 980 DB trên 1 máy chủ và tôi phải cấp quyền truy cập chỉ đọc cho một vài người dùng.

Tôi chắc chắn không muốn chạy alter DB add user...tuyên bố vì nó chắc chắn tốn thời gian.

Tôi không biết nếu exec sp_addrolemember 'db_datareader', 'user'làm việc?

Ai đó có thể cho tôi biết nếu một cái gì đó khác có thể được thực hiện?


Đã viết blog về một cái gì đó tương tự ở đây nếu bạn muốn sử dụng PowerShell: pythian.com/blog/?p=77813

Câu trả lời:


9

Đây là cách tôi sẽ làm điều đó trong Powershell:

$instance = 'localhost'
$dbs = dir SQLSERVER:\SQL\$instance\DEFAULT\Databases
$sql = 'CREATE USER [foo] FROM LOGIN [foo]; ALTER ROLE db_datareader ADD MEMBER [foo];'
$dbs | ForEach-Object {Invoke-Sqlcmd -ServerInstance $instance -Database $_.Name -Query $sql}

Điều này giả sử foo đăng nhập đã được tạo. Nó cũng giả sử chạy trên cá thể localhost.


5

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.


2

Tôi biết có rất nhiều câu trả lời hay hơn, nhưng tôi thích những điều đơn giản.

 SELECT 
      'USE [' + name + N']' + CHAR(13) + CHAR(10)
      + 'create user [USER] for login [LOGIN]' + CHAR(13) + CHAR(10)
      + 'EXEC sp_addrolemember ''db_owner'', ''USER'''

FROM sys.databases

WHERE database_id > 4;

1
Lưu ý rằng - sp_addrolemember -> Tính năng này sẽ bị xóa trong phiên bản tương lai của Microsoft SQL Server. Tránh sử dụng tính năng này trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng tính năng này. Sử dụng ALTER ROLE thay thế.
Kin Shah

Ngoài ra, tốt hơn để sử dụng tên tiêu đề thay vì đặt thủ công []dấu ngoặc.
Kin Shah

1

Một cách tiếp cận con trỏ sẽ như dưới đây. Tôi giả sử rằng đăng nhập đã tồn tại và lược đồ được mặc định dbo.

set nocount on
declare @user_to_be_added sysname
declare @sqltext nvarchar(max) = N''

-- change below to your user to be added .. make sure that the login is already existing
set @user_to_be_added = 'foobar'


select  @sqltext += char(10)+ 'use '+quotename(name)+';'+char(10)+ 'CREATE USER '+quotename(@user_to_be_added)+' FOR LOGIN '+quotename(@user_to_be_added)+';'+char(10)+
'ALTER USER '+quotename(@user_to_be_added)+' WITH DEFAULT_SCHEMA=[dbo];'+char(10)+ 'ALTER ROLE [db_datareader] ADD MEMBER '+quotename(@user_to_be_added)+'; '+ char(10) + 'go'
from sys.databases
where database_id > 4 -- exclude system databases

SELECT @sqltext
--- once you are happy with the output uncomment below line
-- EXEC sp_executesql @sqltext;

Chỉnh sửa cho tôi nếu tôi sai, nhưng bạn không có nguy cơ không nhìn thấy tất cả đầu ra khi nối một lượng lớn văn bản như vậy, sau đó xuất ra nó PRINT? Theo số lượng lớn văn bản, ý tôi là khi làm điều này trên 900 cơ sở dữ liệu.
Max Vernon

1
@MaxVernon yeh đó là PRINThạn chế, tốt hơn là sử dụng CHỌN và lưu nó vào tệp đầu ra.
Kin Shah

-1

sử dụng một thủ tục không có giấy tờ, bạn có thể sử dụng SP_msforeachdbthủ tục.

Ví dụ, việc thực thi sẽ là một cái gì đó dọc theo dòng

exec sp_msforeachdb '
use ?
if (dbid(''?'') > 4 )
BEGIN
    create user [user] from login [login];

    alter role db_datareader add member [user];'
END

Đây không phải là giải pháp tao nhã nhất nhưng nếu bạn chỉ cần thêm đăng nhập vào mọi cơ sở dữ liệu người dùng thì nó sẽ hoạt động.

Lưu ý nhanh, nếu bạn sử dụng máy chủ sql 2008 R2 trở lên, bạn sẽ muốn thay thế alter rolebằng exec sp_addrolemembercú pháp vai trò thay đổi chỉ được thêm vào từ SQL Server 2012 trở lên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.