Tôi cần cấp quyền truy cập đọc đăng nhập mới cho tất cả 300 cơ sở dữ liệu trên máy chủ. Làm thế nào tôi có thể thực hiện điều này mà không cần kiểm tra 300 hộp kiểm trong khu vực lập bản đồ người dùng?Máy chủ SQL - Cách cấp quyền truy cập đọc cho TẤT CẢ cơ sở dữ liệu vào Đăng nhập?
Trả lời
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_MSforeachdb
as 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ự.
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
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
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
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
@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
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'
tôi phải tinh chỉnh câu trả lời Martin Smith hơi như:
- 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
- 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
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
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
- 1. Hạn chế quyền truy cập Đăng nhập SQL Server vào chỉ một cơ sở dữ liệu
- 2. Máy chủ SQL cung cấp thông tin đăng nhập (người dùng) db_owner truy cập vào cơ sở dữ liệu
- 3. Máy chủ SQL: Nhập cơ sở dữ liệu từ .mdf?
- 4. Đính kèm cơ sở dữ liệu không cho máy chủ
- 5. Tương tác Dart/quyền truy cập vào cơ sở dữ liệu
- 6. Khóa cơ sở dữ liệu máy chủ SQL với PHP
- 7. Quyền truy cập vào sys.dm_db_index_usage_stats
- 8. Trình đăng nhập cơ sở dữ liệu tốt cho Java?
- 9. Không thể đăng nhập vào cơ sở dữ liệu dưới dạng SYS với Oracle SQL Developer
- 10. Cách nhập dữ liệu vào Visual Studio 2012 Dự án Cơ sở dữ liệu Máy chủ Sql
- 11. Máy chủ SQL: bạn có thể giới hạn quyền truy cập vào chỉ một bảng
- 12. Truy cập Android vào cơ sở dữ liệu SQL từ xa
- 13. T-SQL Để cấp quyền truy cập đọc và ghi vào các bảng trong cơ sở dữ liệu trong SQL Server là gì?
- 14. tạo mã truy cập để nhập cơ sở dữ liệu
- 15. Đăng nhập máy chủ - trong cơ sở dữ liệu hoặc tệp nhật ký?
- 16. Cách mở cơ sở dữ liệu SQL Compact chỉ đọc
- 17. Không thể đăng nhập vào cơ sở dữ liệu PostgreSQL
- 18. quyền truy cập bị từ chối cho người dùng @ 'localhost' vào cơ sở dữ liệu ''
- 19. SQLite: cơ sở dữ liệu chỉ đọc
- 20. Cơ sở dữ liệu Truy cập SQL trong Excel VBA
- 21. SQL Server 2008 - Người dùng không thể truy cập Cơ sở dữ liệu được khôi phục
- 22. Nhập XML vào cơ sở dữ liệu SQL
- 23. Làm cách nào để có quyền truy cập độc quyền vào cơ sở dữ liệu SQL Server 2005 để khôi phục?
- 24. OperationalError: cố gắng viết một cơ sở dữ liệu chỉ đọc trong máy chủ ubuntu
- 25. Cách thiết lập SQL Server/IIS 7.0 để cho phép trang web ASP.NET MVC truy cập vào cơ sở dữ liệu?
- 26. quyền truy cập SQL Server 2008 R2 Express - không thể tạo cơ sở dữ liệu hoặc sửa đổi người dùng
- 27. T-SQL liệt kê tất cả ánh xạ người dùng với vai trò/quyền cơ sở dữ liệu cho một Đăng nhập
- 28. C# Cơ sở dữ liệu truy cập: DBNull vs null
- 29. Thay đổi cơ sở dữ liệu mặc định cho thông tin đăng nhập SQL Azure
- 30. SQL Server Reporting Services Datasource giữ mất thông tin đăng nhập cơ sở dữ liệu
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
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
@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. –