2010-06-21 64 views

Trả lời

17

Một cách để đặt "Kết quả thành văn bản" trên menu truy vấn trong SSMS rồi thực hiện bên dưới.

Nó thực sự không thực hiện thay đổi nhưng tạo ra một kịch bản để bạn xem xét và thực thi.

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'user_name', 
     @login_name = 'login_name' 

SELECT ' 
    USE ' + QUOTENAME(NAME) + '; 

    CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 

    EXEC sys.sp_addrolemember 
     ''db_datareader'', 
     ''' + QUOTENAME(@user_name) + '''; 

    EXEC sys.sp_addrolemember 
     ''db_denydatawriter'', 
     ''' 
     + QUOTENAME(@user_name) + '''; 

GO 
' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

Hoặc bạn có thể nhìn vào sys.sp_MSforeachdbas here hoặc phiên bản cải tiến Aaron Bertrand của here

Nếu bạn không nhìn thấy tất cả các ký tự khi bạn chạy này, mở Options Query cho văn bản và kiểm tra các cài đặt cho ' Số ký tự tối đa được hiển thị trong mỗi cột '. Đảm bảo rằng giá trị này được đặt thành giá trị đủ lớn để hiển thị tất cả các ký tự.

+2

Tại sao tôi lại nghe về sp_msforeachdb này? Tôi đoán tôi chỉ cố gắng và tìm ra mọi thứ với các công cụ tôi biết. Vâng, tôi đang thêm nó vào hộp công cụ. Cảm ơn! – buckbova

+0

Cảm ơn! Điều này dường như làm việc. Tôi đã sao chép kết quả của truy vấn đó vào ô văn bản và thay thế Đi bằng \ nĐi \ n – Greg

+1

@Greg - Rất vui khi nó hoạt động. Bạn đã chạy nó trong Management Studio?Nếu việc chọn tùy chọn "Kết quả thành văn bản" (CTRL + T) có lẽ sẽ tránh được sự cần thiết cho bước trung gian. –

5

Con trỏ thông qua cơ sở dữ liệu và quyền truy cập GRANT vào từng phần bằng một chút t-sql.

Tôi không kiểm tra mã bên dưới.

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 


WHILE @@FETCH_STATUS = 0 
BEGIN 

GRANT SELECT ON DATABASE::@name to 'username'; 

FETCH NEXT FROM db_cursor INTO @name 
END 
+0

T-sql để sử dụng sau thời điểm đó là bài thơ của tôi t nhầm lẫn. Bất kỳ con trỏ về điều đó? – Greg

2
Declare @Databases Cursor 
Declare @DbName as nvarchar(64) 
Declare @Sql nvarchar(max) 
Declare @BaseAddUserSql nvarchar(max) 
Declare @BaseAddRoleSql nvarchar(max) 

Set @Databases = Cursor Fast_Forward For 
    select [name] 
    from master..sysdatabases 
    where [name] not in('master','model','msdb','tempdb') 

Open @Databases 
Fetch Next From @Databases Into @DbName 

Set @BaseAddUserSql = 'exec sp_adduser ''LOGINNAME''' 
Set @BaseAddRoleSql = 'exec sp_addrolemember ''db_datareader'', ''LOGINNAME''' 


While @@Fetch_Status = 0 
Begin 
    Begin Try 
     Set @Sql = 'Use ' + Quotename(@DbName) 
     exec (@Sql) 

     Set @Sql = Replace(@BaseAddUserSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 

     Set @Sql = Replace(@BaseAddRoleSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 
    End Try 
    Begin Catch 
    End Catch 

    Fetch Next From @Databases Into @DbName 
End 

Close @Databases 
Deallocate @Databases 
+0

Nó nói rằng nó đã hoàn tất thành công nhưng tôi không thấy bất kỳ thay đổi nào. Khu vực ánh xạ người dùng đã không thay đổi. Và thông tin đăng nhập tôi đặt cho không xuất hiện dưới dạng người dùng trong bất kỳ cơ sở dữ liệu nào. Bất kỳ ý tưởng? – Greg

+0

@Greg - Bạn có thể muốn nhận xét các khối Thử-Catch để xem lỗi đang được ném. – Thomas

3
EXEC sp_MSForEachDB 
'Declare @name varchar(100) 
select @name = ''?'' 
PRINT @name 
IF db_id(@name) > 4 
BEGIN 
USE ? 
CREATE USER [user] FOR LOGIN [user]; 
EXEC sp_addrolemember ''db_datareader'', ''user'' 
END' 
2

tôi phải tinh chỉnh câu trả lời Martin Smith hơi như:

  1. Các không gian và xuống hàng dẫn đến không phải tất cả các văn bản được tạo ra đúng
  2. Các QUOTENAME trong báo cáo Exec đưa vào dấu ngoặc vuông không chính xác.

phiên bản của tôi:

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'HelpdeskUser', 
     @login_name = 'Helpdesk' 

SELECT 'USE ' + QUOTENAME(NAME) + '; 
     CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 
    EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + '''; 
    EXEC sys.sp_addrolemember ''db_denydatawriter'', ''' + @user_name + '''; 
GO' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

Nếu không hoạt động hoàn hảo. Cảm ơn

0

Tôi chỉ cần người dùng có quyền truy cập vào tất cả cơ sở dữ liệu với quyền đọc dữ liệu vì vậy tôi đã sử dụng mã này: bạn sẽ cần chạy kết quả từ truy vấn btw.

USE [master] 
GO CREATE LOGIN [DOMAIN\USER] FROM WINDOWS WITH DEFAULT_DATABASE=[master] GO 
select 'use ['+name+'] 
CREATE USER [DOMAIN\USER] FOR LOGIN [DOMAIN\USER] 
EXEC sp_addrolemember N''db_datareader'', N''DOMAIN\USER'' 
' 
from sys.databases 

nếu bạn không muốn áp dụng nó trên cơ sở dữ liệu hệ thống chỉ cần thêm nơi database_id> 6

0

Bạn có thể sử dụng ví dụ Cursor, như thế này:

USE master 
GO 

DECLARE @DatabaseName VARCHAR(32) 
DECLARE @SQL NVARCHAR(max) 
DECLARE @User VARCHAR(64) 
SET @User = '[SQL\srvSSISAcc]' --Your User 

DECLARE Grant_Permission CURSOR LOCAL FOR 
SELECT name FROM MASTER.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 

OPEN Grant_Permission 
FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SELECT @SQL = 'USE '+ '[' + @DatabaseName + ']' +'; '+ 'CREATE USER ' + @User + 
    'FOR LOGIN ' + @User + '; EXEC sp_addrolemember N''db_datareader'', 
    ' + @User + '; EXEC sp_addrolemember N''db_datawriter'', ' + @User + '' 

    EXEC sp_executesql @SQL 
    PRINT @SQL 

FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
END 
CLOSE Grant_Permission 
DEALLOCATE Grant_Permission 

More thông tin tìm thấy trong bài đăng của tôi về chủ đề này: http://www.pigeonsql.com/single-post/2016/12/23/Grant-User-Access-to-All-Databases

Các vấn đề liên quan