在DB1 中拒绝用户选择表 T1,但用户可以在 DB2 中创建同义词,并且可以从 DB1 中进行选择。待定1. 我不能否认为用户创建同义词。是否可以阻止用户在为 DB1.TB1 创建同义词后进行选择?
use d2
create synonym dbo.cl for d1.dbo.cl
select top 100 * from dbo.cl
(100 rows affected)
select top 100 * from d1.dbo.cl
The SELECT permission was denied on the object 'cl', database 'd1', schema 'dbo'.
用户已通过 d2 中的 AD 组db_owner
这是因为SQL Server中的"所有权链接"功能。这意味着,如果一个对象(在您的例子中是同义词(正在调用另一个对象(在您的例子中是表(,那么它会检查对象的所有者是否相同。 如果两个对象的所有者相同,则不检查对被调用对象(因此您的表(的访问权限。
此功能就是例如用户可以访问视图而不访问基础表的原因。
通常,默认情况下不会跨数据库启用此所有权链接。 因此,请检查它是否在您的案例中。 可以在数据库级别授予它:
SELECT is_db_chaining_on, name FROM sys.databases;
或者可以在服务器级别为所有数据库授予它:
EXECUTE sp_configure 'show advanced', 1;
RECONFIGURE;
EXECUTE sp_configure 'cross db ownership chaining';