首页 > 解决方案 > 将选择授予指定列的同义词

问题描述

我一直在尝试限制用户对同义词的选择访问。考虑以下内容:

CREATE USER Test_User WITHOUT LOGIN;
CREATE SYNONYM S_TEST FOR dbo.Items;

GRANT SELECT ON dbo.S_TEST (Id, [Name]) TO Test_User;

我收到一个错误:

消息 1020,级别 16,状态 3,行 4
子实体列表(例如列或安全表达式)无法指定实体级权限。

但是,如果我将其更改为直接使用 dbo.Items 则它可以工作:

GRANT SELECT ON dbo.Items (Id, [Name]) TO Test_User;

如何限制指定用户的同义词上的 SELECT?这可能吗?如果没有,是否有任何替代方案?

标签: sqlsql-server

解决方案


“我怎样才能限制指定用户的同义词上的 SELECT?”你不能。同义词只是对象的替代名称。SYNONYM 在创建对象时引用not时,检查对象是否存在的检查被推迟到运行时。例如,即使引用对象不存在,CREATE SYNONYM dbo.MySynonym FOR MadeUp.TableObject; 也会创建同义词。

CREATE SYNONYM dbo.MySynonym FOR MadeUp.TableObject;
GO

SELECT *
FROM dbo.MySynonym; --fails
GO

DROP SYNONYM dbo.MySynonym;
GO

所有权限都需要设置同义词引用的对象,而不是同义词本身。


推荐阅读