2015-01-26 6 views
0

항목이 있는지 알려주면 권한이 있는지 알 수있는 절차가 필요합니다.mysql 프로 시저가 항목이 존재하는지 확인하십시오.

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) 

는 데이터 항목 (I 권한이 없어)가없는 경우 (경고 1329)가 없다라고하더라도 항상 MySQL을 워크 벤치에 1 반환합니다. 하지만 나는 사실 또는 거짓을 @b에 넣고 싶습니다.

답변

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$$ 
위해 일하는 것입니다
0

이 단축 버전을 사용해보십시오. 주요 문제는 [email protected]입니다. root @ localhost에있는 권한으로 프로 시저를 실행합니다. 그는 모든 권리를 가질 확률이 높기 때문에 허가 제한이 적용되지 않습니다. 따라서 사용자를 제거하고 제한된 사용자로 프로 시저를 작성하거나 [email protected]으로 변경하십시오.
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$$ 
은 거의 여기에 일을하지만