我是存储过程的新手,我很好奇如何完成任务。我想知道的是,如果用户试图执行他没有权利的程序,如何显示消息?
从我可以理解的情况来看,SQL Server本身会处理这些消息。我试过这种方式(在存储过程中):
BEGIN
try
DELETE from MYTABLE
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
并且我写这个或没有天气没有区别。错误是一样的。虽然不知道怎么写自己的消息......
答案 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;
-
正如其他人所指出的那样 - 尝试捕获存储过程中的错误没有意义 - 用户无法访问它...根据定义