all权限用户无法履行存储进程51CTO博客 - 亚美娱乐

all权限用户无法履行存储进程51CTO博客

2019-03-06 10:23:36 | 作者: 智宇 | 标签: 存储,进程,权限 | 浏览: 2067

   咱们运用存储进程的时分,往往只留意要给调用存储进程的账号赋予相应权限,可是实际上存储进程界说用户与这个存储进程能否被履行有直接关系,假如不知道这点,即便调用存储进程的账号具有存相关权限,相同仍是不能履行存储进程。

语法:

CREATE DEFINER=`xx`@`%` PROCEDURE `mmm`

这儿DEFINER有两种形式Security definer和Security invoker


Security definer:
   definer:在履行存储进程前验证definer对应的用户如:xx@%是否存在,以及是否具有履行存储进程的权限。

Security invoker
   invoker:在履行存储进程时判别调用该存储进程的用户是否有相应权限。

   其实,用简单明了言语解说下或许更简单了解:

SECURITY DEFINER 表明界说者必须有相关权限。

SECURITY INVOKER 表明只需调用者有相关权限即可。


问题描绘:

   今日一个其他部分的DBA搭档,要我帮助处理一个问题。说他们事务开发的程序不能正确履行存储进程,因为他们的许多事务逻辑关系都是放在存储进程中判别,而非程序判别。所以这个问题极其重要,直接导致了事务不可用。前端报错感觉是权限不行,且一切调用存储进程的账号都是同一个aaa(这儿用aaa表明事务账户),检查了这个用户的权限,没有问题,最终乃至赋予了all权限,但问题仍旧。到这他和他们部分搭档都以为不再是权限不行的问题。尝试了一些其他办法都无法处理,问题一向就卡在这了,一切人在那着急。


   我上去剖析了一下,的确如他们描绘相同。到库上随机看了一个存储进程c:

  1. CREATE DEFINER=`xx_user`@`%` PROCEDURE `DBQ_MMM`  其它一切存储进程皆是如此。  

  2. show grants for 'xxx_user'@'%' 检查发现没有EXECUTE 运转存储进程的这个权限

  3. 接着,show procedure status like 'c'

      留意Security_type这儿是DEFIN,所以尽管前端程序运用的是具有all权限的aaa账户,可是界说者xxx_user没有履行权限。存储进程仍旧不能被履行,也就难怪为啥纠了断半响最大权限的用户仍然仍是没有权限了。至于这个用户的EXECUTE权限是人为revoke误操作,仍是曾经运用的是INVOKER形式,那就不知道了。可是前者99%的或许。虚惊一场,真是小问题几乎形成大事端啊。


处理办法:

      修正存储进程界说用户,给一个具有履行权限的用户即可

      假如是从其他库导过来的,有很多存储进程一个个修正太费事,供给两个思路:

  1. 在导出的sql顶用sed替换,然后再导入到 新库中。

  2. 直接树立一个与原先库中的界说用户相同的用户。




版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章