如果用户未经授权运行存储过程,则显示消息

时间:2014-11-11 01:36:16

标签: sql-server delphi sql-server-2014

我是存储过程的新手,我很好奇如何完成任务。我想知道的是,如果用户试图执行他没有权利的程序,如何显示消息?

从我可以理解的情况来看,SQL Server本身会处理这些消息。我试过这种方式(在存储过程中):

BEGIN
try
DELETE from MYTABLE
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
        END CATCH;

并且我写这个或没有天气没有区别。错误是一样的。虽然不知道怎么写自己的消息......

3 个答案:

答案 0 :(得分:3)

如果用户尝试执行存储过程或用户定义函数(UDF),但未通过一个或多个角色成员身份明确或隐式地授予他们权限,则SQL Server将处理异常和错误消息。您无法在该代码中设置消息,因为根据定义,不允许用户执行该消息以获取其中的任何错误消息或错误处理。

如果你想要一个自定义消息,你需要从应用程序端捕获SQL异常(应该有一个错误代码,你可以测试它指示" Permission Denied")然后只返回你的自定义消息。

答案 1 :(得分:0)

当您尝试访问未经授权的对象时,会显示修复消息或说明默认消息。

有很多安全功能,如用户,角色,架构等。如果有任何不匹配,您会收到错误“无法找到存储过程'guest.get_procedureName'。”

假设我创建了一个名为procedure1的默认模式(dbo)的过程。

exec dbo.procedure1 para1value,'para2value', null,para4value etc.
exec guest.procedure1 para1value,'para2value', null,para4value etc.

现在如果一切正常,首先将数据提供给sql端和C#端。 但第二个会给我上述错误。

在sqlserver端没有什么可以处理这种类型的安全性,如上面的代码,try catch和C#一样工作,但理想情况下,它只需要你明确要求sql的消息返回直接显示ui即自定义逻辑错误消息,当你运行sp或数据不匹配等时。

对于c#观点,您可以在catch中获取此消息,因此您可以这样做。

public method    
{
 try
   {
      .....
   }
 catch(Exception ex)
   {
       if (ex.Message.Contains("Could not find"))
         //give any your custom message or throw ex
    }
}

答案 2 :(得分:0)

try
   DoTheThing();
except
   on E:Exception
     ShowMessage("Something Went Wrong! : " + E.Message);
end;

这显示了一个自定义消息(各种类型),它还为您提供了一种通过' E'来检查错误内容的方法。

您还可以处理更具体的例外

except
    on E:ESomeSpecificException
      // ----
end;

-

正如其他人所指出的那样 - 尝试捕获存储过程中的错误没有意义 - 用户无法访问它...根据定义