sta*_*ray 4 security sql-server permissions execution-plan
我有一组 5 名开发人员,他们需要能够查看他们为数据库编写的查询计划,并且仅适用于该数据库。我拒绝让他们成为系统管理员的成员。我不希望他们能够在此服务器上运行跟踪,也不希望他们能够运行 dmv。
这 5 位开发人员是 Windows 组的成员。我已经让他们成为 db_owner 的成员。
这是我发现的:
只有 sysadmin 并且如果您映射到 db 中的 dbo 用户名,它不会执行检查。
有没有办法让这些开发人员能够在没有系统管理员角色或授予更改跟踪或授予查看服务器状态的情况下查看计划?
DENY 胜过 GRANT,所以是的,如果您明确拒绝他们更改跟踪的能力,您就不能让人们查看计划。但仅仅因为你没有拒绝一项权利并不意味着它已经被授予。
这个例子说明,你的数据库的用户可以运行查询,并收集他们已被授予在数据库中执行计划SHOWPLAN(并没有被添加到db_owner角色),只要服务器级别的登录也没有被明确拒绝的能力ALTER TRACE。
它还表明,除非您明确授予任何与跟踪相关的权限,否则他们将无法读取跟踪数据,甚至根本无法判断是否有跟踪正在运行,除非他们以其他方式继承了这些权限( Windows 组、服务器角色等)。因此,您无需明确拒绝 ALTER TRACE以保护这些用户的跟踪数据 - 只需注意他们可以在没有明确授权的情况下继承它。
USE master;
GO
CREATE LOGIN blob WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO
CREATE DATABASE floob;
GO
USE floob;
GO
CREATE USER blob FROM LOGIN blob;
GO
GRANT SHOWPLAN TO blob;
GO
CREATE TABLE dbo.splunge(plonk INT);
GO
GRANT SELECT ON dbo.splunge TO blob;
GO
EXECUTE AS USER = 'blob';
GO
SET SHOWPLAN_XML ON;
GO
-- plan is shown:
SELECT plonk FROM dbo.splunge;
GO
SET SHOWPLAN_XML OFF;
GO
-- error:
EXEC sp_trace_getdata @traceid = 1;
GO
-- empty result set:
SELECT * FROM sys.traces;
GO
REVERT;
GO
USE master;
GO
DROP DATABASE floob;
DROP LOGIN blob;
Run Code Online (Sandbox Code Playgroud)