我对存储过程很陌生,只是好奇事情是如何完成的。我想知道的是,如果用户试图执行他没有权限的过程,如何显示消息?
据我所知,Server本身负责处理消息。我尝试过这样做(在存储过程中):
BEGIN
try
DELETE from MYTABLE
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;不管我写不写,这都没什么区别。错误是一样的。我不知道怎么写你自己的信息。
发布于 2014-11-11 03:33:27
如果用户试图执行未通过一个或多个角色成员身份显式或隐式授予其权限的存储过程或用户定义函数(UDF),则Server将处理异常和错误消息。您不能在该代码中设置消息,因为根据定义,不允许用户执行该消息以获取其内部的任何错误消息或错误处理。
如果您想要一个自定义消息,您需要从应用程序端捕获SQL异常(应该有一个错误代码,您可以测试它以指示“拒绝权限”),然后返回您的自定义消息。
发布于 2014-11-11 06:50:07
当您尝试访问未经授权的对象时,有修复消息或默认消息显示。
有这么多的安全特性,如用户、角色、模式等。如果有任何不匹配之处,您就会得到“无法找到存储过程‘guest.get_procedureName’”的错误。
假设创建了一个名为procedure1的默认模式(Dbo)的过程。
exec dbo.procedure1 para1value,'para2value', null,para4value etc.
exec guest.procedure1 para1value,'para2value', null,para4value etc.现在,如果一切顺利,第一次给我数据到side和C#端。但是第二个错误会给我上面的错误。
这种类型的安全性在sqlserver端不需要处理,就像上面的代码一样,尝试捕获与相同,但理想情况下,只有当您显式地希望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
}
}发布于 2014-11-11 09:08:35
try
DoTheThing();
except
on E:Exception
ShowMessage("Something Went Wrong! : " + E.Message);
end;这显示了一个自定义消息(排序),它还为您提供了一种通过'E‘检查错误内容的方法。
您还可以处理更具体的异常。
except
on E:ESomeSpecificException
// ----
end;--
正如其他人所指出的--试图捕捉存储过程中的错误是没有意义的--用户无法访问它.按定义
https://stackoverflow.com/questions/26856092
复制相似问题