sql—拒绝特定用户对一组表的select权限

kmb7vmvb  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(360)

我正在使用 SQL Server 2014 . 我要否认 SELECT 特定用户对一组表的权限。
我有下面的代码可以完成这项工作,但我需要为每个相关表运行它:

USE [MyDatabase]

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

假设我必须拒绝特定用户对所有以“mktg\…”开头的表的select权限,我如何一次性重新编写上述代码?

dpiehjr4

dpiehjr41#

如果所有表都存在于它们自己的模式中,并且该模式中没有其他对象,则可以使用 schema::yourSchemaNameHere 除此之外,一句话也没办法做到。不能使用通配符等。但您可以通过使用动态管理视图做一些有趣的事情,让sql为您生成命令:

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];')
dced5bon

dced5bon2#

使用allmhuran建议的动态sql解决方案(+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上观看现场演示

相关问题