我有一个sproc,用于验证调用者是否有权使用给定的参数调用此sproc。如果呼叫者未获得授权,我希望RAISERROR
具有ACCESS DENIED错误号。现在,它不能是错误号10011(sys.messages中的ACCESS DENIED),因为错误号必须大于50000.我不想使用{{1添加相同的消息(英语和本地化文本) sproc只是为了重新创建相同的ACCESS DENIED错误。什么是正确的方法?
编辑:由于所需的SQL代码应与SQL Azure兼容,因此我最终调用sp_addmessage
没有错误编号,并检查代码中的默认50,000错误代码(在SQL Azure目前不支持RAISERROR
和sp_addmessage
)。
答案 0 :(得分: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
答案 1 :(得分:1)
您无法执行此操作,因为您要引发的内容不是Access denied
错误,而是Access denied with these parameters
错误。
因此,您需要创建一个自定义错误并提高它。
如果您希望“真正的”访问被拒绝错误,则需要撤销对该过程的执行权限。