mysql过程检查条目是否存在

时间:2015-01-26 04:07:26

标签: mysql procedure exists

我需要一个程序来告诉我条目是否存在所以我知道我是否有权限。

    CREATE DEFINER=`root`@`localhost` procedure `checkPermission`(tbl varchar(50), id int, userid int, out b boolean)
begin
    set @q = concat("select idtblUsers into @rs from ", tbl, " where id", tbl, '=', id, ' && idtblUsers=', userid);

    prepare stmt1 FROM @q;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

    if @rs is not null then
        select true into b;
    else
        select false into b;
    end if;

END$$

call checkPermission('tblProjects', 2, 1, @b)

它总是在mysql-workbench中返回1,即使它没有数据(警告1329),如果没有条目(我没有获得许可)。但是我希望在@b中真或假。

2 个答案:

答案 0 :(得分:0)

请试试这个缩短的版本。 主要问题是DEFINER=root@localhost。这将执行具有root @ localhost所具有权限的过程。由于他很可能拥有一切权利,因此他不会受到许可限制。因此,要么删除它并使用受限用户创建过程,要么将其更改为DEFINER=restricted_user@host exists()也是更好的选择,因为它会在找到条目后立即停止。

CREATE procedure `checkPermission`(tbl varchar(50), id int, userid int, out b boolean)
begin
    set @q = concat("select exists(select 'whatever' into b from ", tbl, " where id", tbl, '=', id, ' && idtblUsers=', userid, ')');

    prepare stmt1 FROM @q;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

END$$

答案 1 :(得分:0)

它几乎完成了这项工作,但这对我有用

CREATE procedure `checkPermission`(tbl varchar(50), id int, userid int, out b boolean) 
begin
    set @q = concat("select exists( select idtblUsers from ", tbl, " where id", tbl, '=', id, ' && idtblUsers=', userid, ') into @b ');

    prepare stmt1 FROM @q;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

    select @b into b;
END$$