MySQL存储过程在与“”相同的连接上进行第二次调用时失败;选择命令拒绝给用户';用户'@';本地主机';对于表';视图名称';

MySQL存储过程在与“”相同的连接上进行第二次调用时失败;选择命令拒绝给用户';用户'@';本地主机';对于表';视图名称';,mysql,stored-procedures,mysql-error-1142,Mysql,Stored Procedures,Mysql Error 1142,我有一个名为sales\u observation\u daily\u summary的表,它是sales\u observation\u daily\u summary\u视图的物化视图。我已经定义了一个名为sync_daily_summary_view_和_table的存储过程,它将刷新物化视图。从功能上讲,它的工作原理完全符合我的预期。但是,在同一个连接上两次调用存储过程时,我遇到了一个奇怪的错误(使用连接池时很可能出现这种情况)。最初这是在我的java集成测试中提出的,但是我可以很容易地

我有一个名为sales\u observation\u daily\u summary的表,它是sales\u observation\u daily\u summary\u视图的物化视图。我已经定义了一个名为sync_daily_summary_view_和_table的存储过程,它将刷新物化视图。从功能上讲,它的工作原理完全符合我的预期。但是,在同一个连接上两次调用存储过程时,我遇到了一个奇怪的错误(使用连接池时很可能出现这种情况)。最初这是在我的java集成测试中提出的,但是我可以很容易地在MySQL Workbench上复制它,所以它不应该与JDBC或Spring或者中间的任何东西有任何关系。
call sync_daily_summary_view_with_table();
call sync_daily_summary_view_with_table();
在第一次呼叫中,它执行它应该执行的操作并正常返回。在第二次通话中,我得到:

Error Code: 1142
SELECT command denied to user 'test'@'localhost' for table 'one_pg_someone_sales_observation_daily_summary_view'
在存储过程中引用的sales_observation_daily_summary_视图中引用了一个_pg_someone_sales_observation_daily_summary_视图。该错误消息毫无意义,因为首先,存储过程在第一次运行时没有对象,其次,用户有足够的权限在该视图上进行选择

我不会显示所有涉及的视图,因为它非常复杂,但sales\u observation\u daily\u summary\u视图被定义为几个其他视图的联合,因此:

CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`localhost` 
SQL SECURITY DEFINER 
VIEW `sales_observation_daily_summary_view` AS
        /* Specific Stage and Observer */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   one_pg_someone_sales_observation_daily_summary_view
        UNION ALL /* All Stages */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   all_stages_someone_sales_observation_daily_summary_view
        UNION ALL /* All Activities */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   all_activities_someone_sales_observation_daily_summary_view
        UNION ALL /* All Observers */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   one_pg_everyone_sales_observation_daily_summary_view
        UNION ALL /* Everyone over All Stages */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   all_stages_everyone_sales_observation_daily_summary_view
        UNION ALL /* Everyone over All Activities */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   all_activities_everyone_sales_observation_daily_summary_view
        UNION ALL /* Benchmark */
        SELECT zone,
               session_date,
               session_year,
               session_month,
               session_week,
               phenomenon_group_id,
               phenomenon_group_name,
               stage_id,
               stage_name,
               observer_id,
               series_name,
               benchmark_id,
               session_count,
               session_value,
               benchmark_value
        FROM   benchmark_sales_observation_daily_summary_view
存储过程的定义如下:

DELIMITER $$

CREATE DEFINER=`test`@`localhost` PROCEDURE `sync_daily_summary_view_with_table`()
BEGIN

                /* Update any values that may have changed */
                UPDATE sales_observation_daily_summary tb, 
                       sales_observation_daily_summary_view vw 
                SET    tb.session_count = vw.session_count, 
                       tb.session_value = vw.session_count, 
                       tb.benchmark_value = vw.benchmark_value,
                       tb.series_name = vw.series_name 
                WHERE  vw.zone = tb.zone 
                       AND vw.session_date = tb.session_date 
                       AND Coalesce(vw.phenomenon_group_id, 0) = 
                           Coalesce(tb.phenomenon_group_id, 0) 
                       AND Coalesce(vw.stage_id, 0) = Coalesce(tb.stage_id, 0) 
                       AND Coalesce(vw.observer_id, 0) = Coalesce(tb.observer_id, 0) 
                       AND Coalesce(vw.benchmark_id, 0) = Coalesce(tb.benchmark_id, 0) 
                       AND ( Coalesce(tb.session_count, -1) <> Coalesce(vw.session_count, -1) 
                              OR Coalesce(tb.session_value, -1) <> 
                                 Coalesce(vw.session_value, -1) 
                              OR Coalesce(tb.benchmark_value, -1) <> 
                                 Coalesce(vw.benchmark_value, -1) 
                              OR tb.series_name <> vw.series_name ); 
END
分隔符$$
CREATE DEFINER=`test`@`localhost`过程`sync\u daily\u summary\u view\u with\u table`()
开始
/*更新任何可能已更改的值*/
更新销售\观察\每日\总结tb,
销售\观察\每日\总结\查看大众
设置tb.session\u count=vw.session\u count,
tb.session\u值=vw.session\u计数,
tb.benchmark_值=vw.benchmark_值,
tb.series\u name=vw.series\u name
其中vw.zone=tb.zone
和vw.session_date=tb.session_date
和聚结(vw.I组id,0)=
合并(tb.U组id,0)
和合并(vw.stage_id,0)=合并(tb.stage_id,0)
和合并(vw.observer_id,0)=合并(tb.observer_id,0)
和合并(vw.benchmark_id,0)=合并(tb.benchmark_id,0)
和(合并(tb.session\u count,-1)合并(vw.session\u count,-1)
或合并(tb.session_值,-1)
合并(vw.U值,-1)
或合并(tb.benchmark_值,-1)
合并(vw.benchmark_值,-1)
或tb.series\u名称vw.series\u名称);
结束
我正在本地开发箱上使用5.1.56版日志。
更新1 我还在Amazon RDS服务器版本5.1.57-log上复制了该错误

更新2 如果我将存储过程定义为
sqlsecurityinvoker
,并将其作为root用户执行,它就可以正常工作。这不是一个可接受的解决方法,但它可能是某种线索。(例如,这不是表锁定问题

更新3 所涉及的表是InnoDB表。我不确定这是否是一个线索,但当我在开始时添加了一个开始事务,在结束时添加了一个提交时,它花费了更长的时间来完成,但在第二次调用时得到了相同的错误

更新4
我简化了存储过程,但仍然重现了该问题。它以前有一个insert语句,后跟一个update语句。事实证明update语句足以重现错误,因此我从上面的存储过程中删除了insert语句。

这可能是事务问题。请尝试添加COMMIT语句在UPDATE和INSERT语句之后。如果尚未使用InnoDB,您可能还希望尝试使用InnoDB

您应该尝试这样的函数,看看是否得到相同的结果:

DELIMITER $$

CREATE DEFINER=`test`@`localhost` PROCEDURE `sync_daily_summary_view_with_table`()
BEGIN

            /* Update any values that may have changed */
            UPDATE sales_observation_daily_summary tb, 
                   sales_observation_daily_summary_view vw 
            SET    tb.session_count = vw.session_count, 
                   tb.session_value = vw.session_count, 
                   tb.benchmark_value = vw.benchmark_value,
                   tb.series_name = vw.series_name 
            WHERE  vw.zone = tb.zone 
                   AND vw.session_date = tb.session_date 
                   AND Coalesce(vw.phenomenon_group_id, 0) = 
                       Coalesce(tb.phenomenon_group_id, 0) 
                   AND Coalesce(vw.stage_id, 0) = Coalesce(tb.stage_id, 0) 
                   AND Coalesce(vw.observer_id, 0) = Coalesce(tb.observer_id, 0) 
                   AND Coalesce(vw.benchmark_id, 0) = Coalesce(tb.benchmark_id, 0) 
                   AND ( Coalesce(tb.session_count, -1) <> Coalesce(vw.session_count, -1) 
                          OR Coalesce(tb.session_value, -1) <> 
                             Coalesce(vw.session_value, -1) 
                          OR Coalesce(tb.benchmark_value, -1) <> 
                             Coalesce(vw.benchmark_value, -1) 
                          OR tb.series_name <> vw.series_name ); 
            COMMIT;
END
分隔符$$
CREATE DEFINER=`test`@`localhost`过程`sync\u daily\u summary\u view\u with\u table`()
开始
/*更新任何可能已更改的值*/
更新销售\观察\每日\总结tb,
销售\观察\每日\总结\查看大众
设置tb.session\u count=vw.session\u count,
tb.session\u值=vw.session\u计数,
tb.benchmark_值=vw.benchmark_值,
tb.series\u name=vw.series\u name
其中vw.zone=tb.zone
和vw.session_date=tb.session_date
和聚结(vw.I组id,0)=
合并(tb.U组id,0)
和合并(vw.stage_id,0)=合并(tb.stage_id,0)
和合并(vw.observer_id,0)=合并(tb.observer_id,0)
和合并(vw.benchmark_id,0)=合并(tb.benchmark_id,0)
和(合并(tb.session\u count,-1)合并(vw.session\u count,-1)
或合并(tb.session_值,-1)
合并(vw.U值,-1)
或合并(tb.benchmark_值,-1)
合并(vw.benchmark_值,-1)
或tb.series\u名称vw.series\u名称);
犯罪
结束

自动提交的价值是什么? 选择@自动提交

如果值为0,请尝试在两个调用之间添加提交,因为您可能会以某种方式打开事务 调用sync_daily_summary_view_with_table(); 犯罪 调用sync_daily_summary_view_with_table()


具体化的表是任何视图的一部分吗?

这看起来可能是视图的问题
mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON)
mysql_real_connect (
    mysql, 
    host_name, 
    user_name, 
    password,
    db_name, 
    port_num, 
    socket_name, 
    CLIENT_MULTI_STATEMENTS)