说,我有一个复杂的MySQL程序。该过程基本上是一个复杂的SELECT
查询,它使用表中的数据来输出一些记录。
为方便起见,该过程需要写入临时表来计算最终结果。
我可以正确授予,以便只能读取数据库的用户可以调用此过程来获取其输出,尽管该过程实际上需要写入数据库吗?因为基本上这个程序并不打算写,所以它只是将一些数据缓存到一个名称以下划线开头的特定表中,因此它不应该严重破坏任何内容,除了花费存储磁盘的成本。
答案 0 :(得分:1)
通常,MySQL中的存储过程使用与过程定义者相关联的权限运行,而不是调用过程的用户,只需要对过程执行权限。
可以将存储过程配置为在调用者上下文中运行,从而以与调用用户相同的权限执行,但这并不常见。
确保在定义程序时确保定义者具有执行在执行期间需要完成的所有操作的适当权限。
答案 1 :(得分:1)
在定义安全上下文中执行的存储程序或视图使用其
class Program { static void Main(string[] args) { MainAsync().Wait(); } static async Task MainAsync() { var task = Task.Run(async delegate { Console.WriteLine("Before delay"); await Task.Delay(1000); Console.WriteLine("After delay"); }); await task; Console.WriteLine("await"); Console.ReadLine(); } }
属性指定的帐户的权限执行。这些权限可能与调用用户的权限完全不同。https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html
只要用户定义过程具有必要的权限并且没有明确强制该过程在DEFINER
上下文中运行,调用用户的权限就没有对程序可以做什么的影响。 定义用户的权限适用于该过程的操作。
调用用户只需要能够运行它。不需要特殊安排,因为这是默认行为。
INVOKER
默认为创建过程的用户。如果该帐户具有DEFINER
权限,则他们实际上可以声明其权限将适用的其他定义者帐户。