SQL Разрешения сервера для входа на сервер сценариев (но не для их изменения) - PullRequest
1 голос
/ 09 января 2020

У меня есть скрипт, который пытается воссоздать часть базы данных. Часть этого заключается в сценарии входа в систему, которые используются с этой базой данных.

Я пытаюсь найти уровень разрешения «не навредить» для этого запуска.

В основном это Нужно иметь возможность видеть все логины сервера, чтобы выписать их (кроме паролей, конечно). Но он не должен иметь разрешения на добавление, изменение или удаление чего-либо на сервере. Просто скрипт.

Я посмотрел на роли и разрешения для уровня сервера, и я не нахожу ничего подобного.

Имеет ли SQL Сервер на уровне сервера разрешения только для чтения для логинов?

1 Ответ

1 голос
/ 10 января 2020

Имеет ли SQL Сервер права доступа на чтение для входа в систему на уровне сервера?

Да, но это не для ЛЮБОГО входа в систему, это на детальном уровне для каждого входа в систему: https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-server-principal-permissions-transact-sql

USE master;  
GRANT VIEW DEFINITION ON LOGIN::EricKurjan TO RMeyyappan   
GO

Недостатком является то, что вы должны предоставлять определение представления для каждого входа в систему и каждый раз, когда создается новый вход в систему. Для новых входов в систему можно создать триггер DDL сервера, который предоставит разрешение VIEW DEFINITION для вновь созданного имени входа для вашего имени входа (или лучше создать для этого пользовательскую роль сервера)

CREATE TRIGGER ddl_trig_for_create_login
ON ALL SERVER   
FOR CREATE_LOGIN  
AS
BEGIN   
    declare @newlogin sysname = quotename(EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','sysname'));
    declare @sql nvarchar(200) = 'GRANT VIEW DEFINITION ON LOGIN::'+ @newlogin +' TO public'; --<-- public just for testing.. change public to a custom server role
    exec(@sql);
END
GO 

Другой вариант (не проверен, но по логике это должно работать) было бы создать логин из сертификата или асимметричного ключа c, добавить логин cert / asym в роль securityadmin и затем подписать свой скрипт (тот, который читает логины) ключом cert / asym.

...