생계/Oracle2020. 6. 9. 20:48


테이블에 대한 권한을 role 에 주는 것과 바로 유저에게 주는 것에 차이가 있을까?



ex)  grant select on tabA to roleA  VS  grant select on tabA to userA


두 경우 모두 테이블을 직접 사용하는 것에는 차이가 없다. 


하지만 만약 role 로 부여받은 권한으로 pl/sql 을 작성하려고 하면 에러가 날 것이다. 





==============  테스트 스크립트 =================


-- 1. 테이블 오너 tab_user,  프로시져를 생성할  ddl_user  생성


create user tab_user identified by "q1w2e3r4";

conn tab_user/"q1w2e3r4" 

 

create user ddl_user identified by "q1w2e3r4"; 

conn ddl_user/"q1w2e3r4"

 

grant resource to tab_user;

grant connect to tab_user;

grant resource to ddl_user;

grant connect to ddl_user;

 

alter user tab_user quota 30M on users;

 

-- 2. 프로시저에 쓰일 테스트 테이블, 데이터 생성


create table tab_user.ddltest(

a int

;

 

insert into tab_user.ddltest values(1);

commit;


-- 3. 롤 생성

 

create role test_role;

grant select on tab_user.ddltest to test_role;

grant test_role to ddl_user;

 


sqlplus ddl_user/"q1w2e3r4"

 

select * from tab_user.ddltest;

=> 조회 가능 


-- 4. 테스트 프로시져 생성

 

create or replace procedure ddl_user.test_pcdr

is

 v_msg varchar2(100);

 begin

 

           select a into v_msg

           from tab_user.ddltest;

          

end;

/


=> PL/SQL: ORA-00942 : table or view does not exist


-- 5. 직접 권한 부여 


grant select on tab_user.ddltest to ddl_user;

 

이후에 프로시져를 생성하면 잘 된다. 




## 결론 : 권한관리를 위해 role 오브젝트를 사용하여 개발자에게 권한을 부여하지만

   pl/sql 을 사용하기 위해서는 직접 사용자에게 권한이 주어져야 한다. 


지금 조회되는 테이블이 role 을 부여받아서 조회가 되는건지 다이렉트로 권한을 받아서 되는건지

확인 하고자 할 때는 아래와 같이 하면 된다. 

 


select * from tab_user.ddltest;

 => 조회 가능 


set role none;

 

select * from tab_user.ddltest;

 => ORA-00942


이렇다면 role 로만 권한을 받은 것이다. 



 




반응형

'생계 > Oracle' 카테고리의 다른 글

오라클 라이선스 lifetime support  (0) 2021.08.26
create view , any view 권한  (0) 2020.06.16
DB를 사용한 채번 방식 알아보자  (0) 2020.04.30
오라클 로그인 특수문자 입력  (0) 2020.01.30
권한 확인 SQL  (0) 2019.08.29
Posted by 돌고래트레이너