Отказать в разрешении на выбор для набора таблиц указанному пользователю c - PullRequest
0 голосов
/ 09 июля 2020

Я использую SQL Server 2014. Мне нужно отказать SELECT в разрешении для определенного c пользователя в наборе таблиц.

У меня есть следующий код, который выполнит эту работу, но мне нужно запустить его для каждой соответствующей таблицы:

USE [MyDatabase]

DENY SELECT ON [mktg_Rating] TO [xxxxx\User]

Предполагая, что я должен отказать в разрешении на выбор указанному c пользователю во всех таблицах, начинающихся с «mktg _...», как я могу переписать приведенный выше код, чтобы сделать это в одном go ?

Ответы [ 2 ]

3 голосов
/ 09 июля 2020

Если все таблицы живут в своей собственной схеме, и в этой схеме нет других объектов, вы можете запретить выбор в самой схеме, используя schema::yourSchemaNameHere

Кроме этого, нет возможности сделать это в одном заявлении. Вы не можете использовать подстановочные знаки и так далее. Но вы можете сделать так, чтобы SQL сгенерировал для вас команды, выполнив некоторые забавные вещи с динамическими c представлениями управления:

select concat('deny select on ', s.name, '.', t.name, ' to [xxxxx\user];')
from   sys.tables  t
join   sys.schemas s on s.schema_id = t.schema_id
where  t.name like 'mktg[_]%'

Запустите этот запрос, чтобы создать нужные вам операторы, затем скопируйте вывод обратно в окно запроса и запустите их все вместе.

Добавьте вызовы к quotename(), если у вас есть какие-то фанковые имена ...

select concat('deny select on ', quotename(s.name), '.', quotename(t.name), ' to [xxxxx\user];')
2 голосов
/ 09 июля 2020

Следуя динамике c SQL Решение, предложенное allmhuran (+1 от меня!) - и, предполагая SQL Server 2017 или выше, вы можете использовать string_agg, чтобы создать sql для вас :

DECLARE @Sql nvarchar(max);

SELECT @Sql = 'DENY SELECT ON '+ 
(
    SELECT STRING_AGG(QUOTENAME(name), ' TO [xxxxx\user]; DENY SELECT ON ')
    FROM sys.Tables
    WHERE name LIKE 'mktg%'
) + ' TO [xxxxx\user];'

-- When using dynamic SQL, print is your best friend.
PRINT @Sql;

-- Once you've seen that the SQL is Ok, go ahead and unremark the `Exec` to execute it.
--EXEC(@Sql)

Посмотреть живую демонстрацию на db <> fiddle

...