sql-server - 创建查看查看结果的权限,无需访问其背后的表
问题描述
我正在尝试在 MSSQL2008 中创建一个视图,该视图提供系统表中的一些特定详细信息,因为该视图的用户本身无权访问系统表。有没有办法允许他们通过视图查看该数据,但不能直接从表中访问它?就像给视图一个特定的用户来执行,不管谁在调用视图(假设该用户有权从视图中选择)。
我找到了从视图中选择的权限,从表中选择,但不是我正在寻找的中间。
解决方案
正如我所提到的(在我已删除的评论中),只要 2 个对象(在本例中为TABLE
and VIEW
)具有相同的所有者,那么USER
使用该对象的对象可以使用所有权链接。因此,如果可以从USER
访问但不能从 访问,当他们查询时,他们将被授予能够查询表的隐式权限,因为它们归同一个用户所有。SELECT
VIEW
TABLE
VIEW
这种链接可以在之后继续。例如,aPROCEDURE
引用 a VIEW
,引用 3 TABLE
s,然后INSERT
s 进入 4th。USER
可能仅有权使用,PROCEDURE
但如果所有对象都属于同一人USER
,则权限将隐式授予两者SELECT
并INSERT
在 的上下文中PROCEDURE
。
这在文档中有更详细的解释。
作为一个简单的示例,请参见下面的内容,尽管基础表上有明确的说明,但用户SomeUser
成功地SELECT
从. 在这种情况下,在我的实例中,两个对象都归用户所有:VIEW
DENY
dbo
--Create table
CREATE TABLE dbo.SomeTable (SomeID int IDENTITY,
SomeDate datetime DEFAULT GETDATE());
GO
--Some Rows
INSERT INTO dbo.SomeTable
DEFAULT VALUES;
GO 25
--Create view
CREATE VIEW dbo.SomeView AS
SELECT SomeDate
FROM dbo.SomeTable;
GO
--See Owners
SELECT o.[name] AS ObjectName, dp.[name] AS OwningUser
FROM sys.objects o
JOIN sys.schemas s ON s.schema_id = o.schema_id
JOIN sys.database_principals dp ON o.principal_id = dp.principal_id
OR (o.principal_id IS NULL AND s.principal_id = dp.principal_id)
WHERE o.[name] IN (N'SomeTable','SomeView');
GO
--Create User
CREATE USER SomeUser WITHOUT LOGIN;
GO
--Grant SELECT on View, DENY on Table
GRANT SELECT ON dbo.SomeView TO SomeUser;
DENY SELECT ON dbo.SomeTable TO SomeUser;
GO
--Switch User Context
EXECUTE AS USER = 'SomeUser';
GO
--Run Select
SELECT *
FROM dbo.SomeView;
GO
--Revert context
REVERT
GO
--Clean up
DROP USER SomeUser;
DROP VIEW dbo.SomeView;
DROP TABLE dbo.SomeTable;
推荐阅读
- swift - 图像识别Swift时不同位置的SCNNode位置
- powershell - PowerShell:捕获错误但不循环继续?
- ruby-on-rails - Rails - 关闭当前的数据库连接
- python - 当我从批处理文件和任务计划程序运行脚本时,子进程运行、check_output、Popen 返回空字符串
- python - Python FTP ftplib 将整个文件夹移动到另一个目录失败,并显示“无法链接到另一个设备上的文件”
- python - 将 csv 目录读入 Pandas 数据框
- shell - 操作系统版本捕获脚本 - 使用 awk 时出现意外结果
- python - 无法通过请求库将文件上传到 API
- c++ - 对象已定义
- c++ - 如何使用 bitblt 在屏幕上绘制由数组制作的位图?