【问题标题】:About dynamic SQL in SQL Server, it does not check for permissions when dynamic SQL is used关于 SQL Server 中的动态 SQL,使用动态 SQL 时不检查权限
【发布时间】:2011-07-05 16:07:19
【问题描述】:

什么是动态SQL?

我在一本书中读到,当我们使用动态 SQL 时,SQL 会检查权限。但是当我们不使用它时,就没有权限检查。为什么会这样?

我做了一个存储过程,它更新了一个表。

create proc steve_SP AS update steveTABLE set eid = 2 where ename = 'henry'

steve_SP & steveTABLE 的所有者是 STEVE。

我授予新用户“Bob”执行 steve_SP 的权限,但没有授予 steveTABLE 的任何权限。

现在,当 Bob 执行该过程时,它就会成功执行。

但是,当过程的代码被更改(使用动态 SQL)到下面的代码时。

create proc steve_SP AS EXECUTE (update steveTABLE set eid = 2 where ename = 'henry' )

然后,Bob 执行该过程。这次 steve_SP 的执行失败了。为什么会这样?

【问题讨论】:

  • 阅读 Erland Sommarskog 的The curse and blessing of dynamic SQL - 多次!并吸收他出色的专业知识 - 动态 SQL 是一把双刃剑 - 强大且无所不能,但也很棘手和危险。权限问题只是开始.....

标签: sql sql-server sql-server-2005 stored-procedures dynamic-sql


【解决方案1】:

过程是您控制对表的访问的一种方式。

您可以拒绝用户对表的所有访问路径 - 除了通过 DML 存储的过程 - 因此过程中的 CRUD 可以在普通 CRUD 对用户不起作用的情况下工作是有意义的。

但是,当您运行动态 SQL 时,它实际上是在单独的 SPID(进程)中运行的,因此就像用户在新的查询窗口中运行动态 SQL 中的代码一样。

因此,第一种情况:

create proc steve_SP AS update steveTABLE set eid = 2 where ename = 'henry'

用户执行steve_SP - 在内部进行更新 -> OK

第二:

create proc steve_SP AS
EXECUTE ('update steveTABLE set eid = 2 where ename = ''henry''')

用户有权访问 steve_SP,因此运行。在那里运行 EXECUTE,它启动并在另一个进程中运行它:

update steveTABLE set eid = 2 where ename = 'henry'

直接更新? -> 没有。您可以使用WITH EXECUTE AS 选项来解决这个问题。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2010-09-20
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多