【发布时间】:2016-09-03 14:57:06
【问题描述】:
关于我看到但无法弄清楚的行为,我有一个非常具体的问题。我会用代码引导你完成这个问题。
使用系统管理员用户启动 SSMS:
1.创建一个新的测试数据库
create database test
2。创建一个新的登录名
create login newuser with password='newuser', check_policy=off
3.在测试数据库中创建一个用户并将其映射到登录名
create user newuser for login newuser
4.创建一个新表并对其进行测试
create table dbo.newtable (id int identity(1, 1))
insert dbo.newtable default values
select * from dbo.newtable
5.以新用户身份执行
这一步会证明newuser对表没有SELECT权限。
exec as user = 'NewUser'
select suser_sname() as [suser_sname()], original_login() as [original_login()]
select * from dbo.NewTable
revert
输出:
消息 229,第 14 级,状态 5,第 3 行 对象“newtable”、数据库“test”、模式“dbo”的 SELECT 权限被拒绝。
现在,下一步是乐趣的开始。如果你把上面的代码sn-p封装在一个proc里面,你会看到newuser突然可以查询表了。
- 创建一个过程
create proc dbo.newproc
as
exec as user = 'newuser'
select suser_sname() as [suser_sname()], original_login() as [original_login()]
select * from dbo.newtable
revert
go
-- Note I haven't granted any permissions to newuser whatsoever.
exec dbo.newproc
输出:
suser_sname() original_login() ---------------------------------- 新用户域\louie.bao ID -- 1
谁能向我解释一下,在 proc 中执行相同代码的权限检查有何不同?
编辑
更麻烦的是,即使你专门发出了 DENY,newuser 仍然可以访问 dbo.newtable:
deny select on dbo.newtable to newuser
exec dbo.newproc
我了解所有权链接将授予对 proc 调用者(在本例中为我)的访问权限,但当我特别想作为另一个用户执行时,我希望检查该用户的权限。
【问题讨论】:
-
即使有人可以重现相同的输出,我也很想知道。
标签: sql-server permissions sql-server-2012