3

我有一个存储过程,它验证调用者是否被授权使用给定的参数调用这个存储过程。如果调用者未经授权,我想RAISERROR使用 ACCESS DENIED 错误号。现在,它不能是错误号 10011(sys.messages 中的访问被拒绝),因为错误号必须大于 50000。我不想使用 sproc 添加相同的消息(英语和本地化文本)sp_addmessage只是为了重新创建相同的 ACCESS DENIED 错误。这样做的正确方法是什么?

编辑:因为所需的 SQL 代码应该与 SQL Azure 兼容,所以我最终调用RAISERROR时没有错误号,并在后面的代码中检查默认的 50,000 个错误代码(在 SQL Azure 中,目前不支持sp_addmessageand sys.messages)。

4

2 回答 2

2

创建一个AccessDeniedTable当前数据库用户永远无法访问的表。当您遇到逻辑ACCESS DENIED条件问题时SELECT @x=COUNT(*) FROM AccessDeniedTable,应该抛出您所追求的实际错误。

IF @Accesslevel<5 ---your condition here
BEGIN
    SELECT @x=COUNT(*) FROM AccessDeniedTable --throw standard ACCESS DENIED error
    RAISERROR('FATAL ERROR',16,1) --just in case actual error is not thrown
    RETURN 999999 --just in case
END
于 2011-08-10T20:09:25.630 回答
1

您不能这样做,因为您要提出的不是Access denied错误,而是Access denied with these parameters错误。因此,您需要创建一个自定义错误并提出它。

如果您想要“真正的”访问被拒绝错误,则需要撤销该过程的执行权限。

于 2011-08-10T22:11:59.247 回答