use*_*867 2 sql-server permissions view
我特别在谈论 SQL Server。我想一个用户尝试过它并得到一个错误(您没有对查询中未明确提及的隐藏底层视图 B 的选择权限)。主视图 A 将一个表和另一个视图(视图 B)连接在一起,并且它们没有视图 B 的权限。
我不负责数据库的权限,但我很好奇它是如何工作的。
您是否需要为视图下构建的每个对象授予权限?还是只是视图本身?或者两者之一?
我认为视图的目的之一是您不想为其授予完全权限的底层对象的快照。这对我来说是不寻常的。
您是否需要为视图下构建的每个对象授予权限?还是只是视图本身?或者两者之一?
需要为视图引用的每个对象执行查询的人授予权限。除非它们归视图所有者所有。在这种情况下,所有权链就会发挥作用。
当通过链访问对象时,SQL Server 首先将对象的所有者与调用对象的所有者进行比较。这是链中的前一个环节。如果两个对象具有相同的所有者,则不会评估对引用对象的权限。
下面创建两个表。T1(由 TestUser1 拥有)和 T2(由 TestUser2 拥有)以及引用这两个表并由 TestUser1 拥有的视图。
第三个用户被授予对视图的 SELECT 权限,但没有任何基础对象。从视图中选择最初对他们来说是失败的。但是,在授予他们对 T2 的选择权限后,它会成功。无需授予他们对 T1 的权限,因为它与视图属于同一用户。
CREATE USER TestUser1 WITHOUT LOGIN;
CREATE USER TestUser2 WITHOUT LOGIN;
CREATE USER TestUser3 WITHOUT LOGIN;
CREATE TABLE dbo.T1(C INT);
ALTER AUTHORIZATION ON dbo.T1 TO TestUser1;
CREATE TABLE dbo.T2(C INT);
ALTER AUTHORIZATION ON dbo.T2 TO TestUser2;
GO
CREATE VIEW dbo.V
AS
SELECT T1.C
FROM dbo.T1 CROSS JOIN dbo.T2
GO
ALTER AUTHORIZATION ON dbo.V TO TestUser1;
GRANT SELECT ON dbo.V TO TestUser3;
Run Code Online (Sandbox Code Playgroud)
EXECUTE AS USER='TestUser3';
SELECT *
FROM dbo.V;
REVERT;
Run Code Online (Sandbox Code Playgroud)
对象“T2”、数据库“Foo”、架构“dbo”的 SELECT 权限被拒绝。
GRANT SELECT ON dbo.T2 TO TestUser3
EXECUTE AS USER='TestUser3';
SELECT *
FROM dbo.V;
REVERT;
Run Code Online (Sandbox Code Playgroud)
DROP TABLE dbo.T1, dbo.T2
DROP VIEW dbo.V
DROP USER TestUser1
DROP USER TestUser2
DROP USER TestUser3
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1530 次 |
最近记录: |