2010-08-10 2 views
1

Пользователь, которому я должен иметь доступ ко всем таблицам в базе данных - SELECT, INSERT, UPDATE, DELETE и EXECUTE (код ASP винить: -P), за исключением 1 таблицы, например users.Грант SELECT, UPDATE, INSERT, DELETE для всех таблиц, кроме 1 (или более) в SQL Server 2005

При предоставлении db_datareader и db_datawriter это дает им полный доступ ко всему и удаление разрешения DELETE на столе users не будет работать.

Существует более 60 таблиц и ищет более быстрый способ, чем использовать SSMS, чтобы проходить через каждый стол и делать это.

Как бы я это сделал?

ответ

4

Вы можете явно запретить разрешения, которые должны иметь приоритет. Синтаксис

deny delete on dbo.users to username 
+0

Итак, я могу добавить db_datareader и db_datawriter, а затем отдельно исключить разрешение на этот параметр ic table, и все должно быть хорошо? –

+0

Да. из MSDN 'фиксированная роль базы данных db_datawriter может добавлять, удалять или изменять данные во всех пользовательских таблицах'', поэтому, если вы вычтите разрешения для этой таблицы, вы должны получить нужный вам набор. –

0

Вы можете использовать Hacky курсор и sp_executesql (GRANT не может принимать переменную имя_таблицу)

declare ctable cursor for 
    select Name from sysobjects where type = 'u' 

declare @Name sysname 
declare @ExecSQL nvarchar(512) 

open ctable 
fetch next FROM ctable into @Name 

while (@@FETCH_STATUS = 0) 
    begin 
     if (@Name <> 'MyTableToExclude') 
     BEGIN 
      SET @ExecSQL = 'grant SELECT on ' + @Name + ' to PUBLIC' 
      EXEC sp_executesql @ExecSQL 

... и т.д.

 END 
     fetch next FROM ctable into @Name 
    end 
close ctable 
deallocate ctable 

Minor ... обратите внимание, что вы не можете предоставить exec на таблицах;)

Смежные вопросы