2015-08-04 5 views
0

Каждый день в нашем хранилище данных (который будет динамически меняться) таблицы отбрасываются и перестраиваются. Также возможно, что какой-нибудь разработчик в нашей организации создаст больше таблиц в этой базе данных. Из-за этого я не могу предоставить разрешения для постоянной базы данных.Предоставить все таблицы (кроме 1) Разрешить чтение роли, не зная, какие таблицы есть каждый день

Вопрос: Я хочу, чтобы сделать какую-то работу, которая работает каждый день, в котором перечислены все имена таблиц (которые существующие в то время) в базе данных, как «SELECT * FROM sys.tables» Тогда я чтобы имена таблиц в качестве значения ввода в сценарий, который работает корыто всех имена таблиц и помещает их в сценарии, как:

GRANT SELECT TO [Tablename1] TO [ROLE_READALLTABLES Except 1 table], 
GRANT SELECT TO [Tablenaam2] TO [ROLE_READALLTABLES Except 1 table] 

и так продолжаться в цикле, пока все существующие таблицы не читаемы. Таким образом, все таблицы (кроме 1 таблицы) во всей базе данных должны получить разрешение GRANT SELECT.

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

UPDATE Я использую Microsoft SQL Server 2014, и я работаю через SQL Management Studio 2014 UPDATE 2: Существует одно исключение. В этой таблице есть схема [dbo]. как и все остальные таблицы

+0

Я использую MS SQL Server 2014, я работаю с студией управления SQL 2014 – Ronald

ответ

0

Вы можете использовать роль db_datareader для предоставления доступа ко всем таблицам в целом, а затем к определенной роли с правилом DENY, чтобы исключить доступ к одной таблице, являющейся исключением.

Эти шаги были бы примерно так:

1) Создайте свой "Прочитайте все, кроме 1 роли":

CREATE ROLE [ROLE_READALLEXCEPT1] 

2) Создать свой "отрицать" роль, как так:

CREATE ROLE [ROLE_DENY] 
GO 
DENY SELECT, INSERT, UPDATE, DELETE ON myTable TO [ROLE_DENY] 
GO 

3) добавьте "кроме 1" роль в ней:

EXEC sp_addrolemember @rolename = 'ROLE_DENY', @membername = 'ROLE_READALLEXCEPT1' 

4) Добавить свою роль в db_datareader:

EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'ROLE_READALLEXCEPT1' 

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

Вы можете добавить пользователей в раздел "ROLE_READALLEXCEPT1", и у них будет доступ ко всем , за исключением одной таблицы исключений.

+0

Возможно, это глупый вопрос, но в какой роли я должен поставить пользователя, который должен иметь доступ ко всем таблицам. И в whitch ROLE должен ли я поставить пользователя, который имеет доступ ко всем таблицам, кроме таблицы исключений? – Ronald

+0

Я добавил к своему ответу, чтобы было ясно, что вы должны добавить своих обычных пользователей (кому нужен доступ ко всему, кроме одной таблицы), к «ROLE_READALLTABLES». Если вам нужен другой пользователь с доступом ко всему абсолютно, вы можете сделать любой из: 1. создать другую роль (возможно, лучше всего), 2. добавить их прямо к db_datareader или 3. сделать их dbo, если необходимо. – beercohol

+0

Я обновил имена ролей в моем примере, чтобы попытаться сделать его еще четче. Надеюсь, это поможет! – beercohol

0

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

самым простым путем является предоставление permission at the schema level.
переместить одну таблицу на отдельную схему с ограниченными разрешениями и предоставить полный доступ на чтение по всей схеме, где пользовательские таблицы проживают:

GRANT SELECT ON SCHEMA::dbo TO [relevant role/user]; 

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

Огромный профессионал этого решения в том, что это огонь и забудьте: на месте нет обслуживания, нет заданий, нет сценария для работы ежедневно/еженедельно/независимо.

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

+0

Есть одно исключение. В этой таблице есть схема [dbo]. как и все другие таблицы – Ronald

+0

, это одно из предположений, которые я сделал, даже если я не написал его, и поэтому первая операция, которую я предлагаю, заключается в перемещении этой таблицы в другую схему. к сожалению, в этом вопросе нет никакой информации, поэтому я должен был сделать много догадок. эта таблица может быть перемещена? – Paolo

+0

К сожалению, это то, что не может ответить, потому что я сам не несу ответственности за изменение структуры таблиц. Мне не разрешено это делать, – Ronald