Роли и разрешения SQL Server - PullRequest
0 голосов
/ 27 марта 2019

Мне очень нужны советы по добавлению ролей на уровне сервера и применению некоторых разрешений, которые будут применяться к каждой базе данных на моем сервере.

В основном мне нужно, чтобы две роли были только для чтения и для чтения и записи. Чтение будет иметь права на выбор и просмотр любого объекта. Запись будет иметь права на выбор / вставку / удаление и выполнение любого объекта

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

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

Что я вижу, я не могу назначить чтение или запись роли и затем использовать ее для каждой базы данных, напротив, на вкладке «Общие» роли сервера у меня есть куча разрешений, которые неясно, какой из них использовать для этого.

Возможно, я делаю это неправильно, но я хочу иметь что-то на уровне сервера и не определять одну и ту же роль в каждом БД для этой цели. Я использую SQL Server 2014.

1 Ответ

0 голосов
/ 27 марта 2019

Короткий ответ: Вы не можете .

Обычно разрешения на уровне сервера не распространяются на отдельные объекты в базах данных. Единственное исключение - это роль sysadmin, которую я настоятельно рекомендую вам использовать , а не для этой цели, поскольку вы, по сути, передаете контроль над всем экземпляром сервера каждому члену.

В качестве краткости вы можете использовать встроенные роли базы данных, чтобы избавить себя от проблем. Для доступа только для чтения обычно достаточно членства в роли db_datareader, если только у вас нет хранимых процедур, которые возвращают наборы данных, которые эта роль должна выполнять. Существует также аналогичная роль для модификации, db_datawriter, но она не распространяется на разрешение execute. Таким образом, вам нужно будет создать собственную роль для этого:

create role [DataChanger] authorization [dbo];
go
alter role [db_datareader] add member [DataChanger];
go
alter role [db_datawriter] add member [DataChanger];
go
grant execute to [DataChanger];
go

-- Now you can add your members. Here is a reader
create user [Domain\MyUser1] from login [Domain\MyUser1];
go
alter role [db_datareader] add member [Domain\MyUser1];
go
-- Writer
create user [Domain\MyUser2] from login [Domain\MyUser2];
go
alter role [DataChanger] add member [Domain\MyUser2];
go

Эти разрешения будут автоматически выбирать вновь созданные объекты без необходимости явного добавления новых разрешений после каждого изменения схемы.

Вам придется делать это в контексте каждой пользовательской базы данных, которой вы хотите управлять таким образом. Вероятно, вы можете создать задание агента SQL, которое будет запускаться периодически, и вносить эти изменения в любые пользовательские базы данных, у которых их еще нет (например, если база данных была восстановлена ​​из более ранней резервной копии, или перенесена с другого сервера, или нового один был создан). Кроме того, поскольку вы не можете циклически проходить по базам данных в статическом коде, вам нужно будет обернуть его в динамический SQL и выполнить цикл по sys.databases, или, возможно, с помощью недокументированной sp_MSforeachdb системной хранимой процедуры. О, и не забудьте удалить все эти операторы go из динамического кода, так как они не являются частью SQL и распознаются только SSMS и sqlcmd.

P.S. Несмотря на это, я надеюсь, что вы не собираетесь управлять производственными базами данных таким образом. Я даже не знаю, с чего начать, насколько небезопасен этот подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...