我最近遇到了一个问题,COUNT(*)
要求用户对表的每一列都具有选择权限。即使'COUNT(*)'的规范明确指出
它不使用有关任何特定列的信息。
它只是返回结果中的行数。
因此,如果您想将表中的行数算作受限用户,则会获得权限异常。
这是一个例子:
CREATE TABLE [Product] ([name] nvarchar(100) null, [price] float) CREATE USER Intern WITHOUT LOGIN; DENY SELECT ON [Product] (price) TO Intern; EXECUTE AS Intern; -- Fails with "The SELECT permission was denied on the column 'price' of the object 'Product'" SELECT COUNT(*) FROM [Product]; REVERT;
经过一些测试,我发现它甚至
SELECT COUNT(1) FROM [Product]
不起作用。
有人可以解释这种行为背后的原因是什么吗?什么是允许Intern
用户仍然获得的准确计数的解决方法Product
。
更新:我对实习生可以使用的解决方法最感兴趣。因此,即使对于管理员来说,创建视图是最佳实践,实习生也没有此选项。