【发布时间】:2018-07-21 00:56:23
【问题描述】:
我想做的是评估如下 SQL 表达式:
IF HAS_DBACCESS('ExampleDB') = 1
BEGIN
USE ExampleDB
--Other stuff
END
根据此查询,如果执行此查询的用户有权访问 ExampleDB,它应该只执行与 ExampleDB 相关的操作。
当我以无法访问此数据库的用户身份运行此查询时,我收到以下错误消息:
服务器主体“MY_USERNAME”无法访问数据库 当前安全上下文下的“ExampleDB”。
这对我来说很奇怪。我没有可以访问 ExampleDB。因此,HAS_DBACCESS('ExampleDB') 的计算结果为 0。我通过选择它的值确认了这一点。事实上,如果我将 USE ExampleDB 替换为 USE 语句以外的任何内容(例如,SELECT 'Test'),它不会评估,这是正确的行为。
出于某种原因,它甚至会在检查条件之前尝试评估 USE ExampleDB 的访问权限。这是预期的行为吗?如果是这样,有什么办法可以解决这个问题?
【问题讨论】:
-
我可能从我的大脑深处错误地提取了这个,但是,我认为无论它在批处理中的哪个位置,我都认为派生了
USE语句,甚至是可能无法运行的部分。您可能需要使用动态 SQL 来完成您想要做的任何事情。 -
上面链接的副本不是完全相同的副本,但问题和答案是相同的。归结为 USE 语句在编译时和执行时都执行。
标签: sql sql-server