DCL

개요

Data Control Language.
데이터 제어어.

사용자의 데이터베이스에 접근하고 객체를 사용하는 권한을 제어한다.
정말 단순하다.
그냥 누구에게 어떤 권한을 준다, 누구에게 어떤 권한을 회수한다, 이 개념만 존재한다.

권한을 받는 주체

유저

기본적으로 DB에서는 사용자(계정)을 만들고 접속해야 한다.
해당 계정이 어떤 권한을 가지고 있는지를 따지고 각종 명령을 수행할 수 있게 한다.

오라클에서 제공하는 계정과 접속 방법

오라클에서는 기본적으로 다음의 기본 계정을 제공한다.

  • scott
    • 테스트용 샘플 유저
  • sys
    • dba 권한을 가진 최상위 유저
  • system
    • db 생성 제거까지는 불가능한 차상위 유저
      Pasted image 20241111142113.png
      sys로 진입할 때는 어떤 역할로 들어가고자 하는지도 명시해야 한다.
      Pasted image 20241111142218.png
      하지만 system은 그럴 필요까지도 없다.
create user dcl_test identified by 1234;

이렇게 유저를 만들 수 있다.위와 같이 유저를 만든다.

ROLE

일일히 유저에게 권한을 주기 어려우니까, role을 만들고 이걸 유저에게 부여할 수 있다.
쿠버 RBAC 방식이 가능한 것이다.

create role trole;
grant CREATE session, create table to trole;

이건 실습은 하지 않겠다.
롤을 만들고, 거기에 권한을 넣는다.
그리고 이걸 또 유저에게 grant하면 된다.

당연히 잘 쓰이는 role를 dbms는 미리 제공한다.

리소스에 뭐가.. 많긴 한데 아무튼.

GRANT

권한을 부여하는 명령어.

 grant create session to dcl_test;

유저가 실제로 디비에 접속을 하기 위해서는 세션을 만들 권한이 있어야 한다.
접속 권한이라고도 할 수 있다.

 grant create table to dcl_test;

이건 테이블을 만드는 권한이다.
이런 식으로 어떤 명령어를 어떤 유저에게 주겠다, 하는 식으로 권한을 부여한다.

 grant select, insert, update, delete on sqld.tb_adres_cl_se to dcl_test;

이렇게 하면 sqld가 가진 테이블에 내가 만든 유저가 crud를 할 수 있게 된다.

Pasted image 20241111143514.png
웃긴 건, 사실 이렇게 해서 테스트 유저가 테이블을 만들 수는 있게 됐지만 그래도 안 속에 데이터를 넣지는 못한다..ㅋ
이것은 실제 물리적 공간인 테이블스페이스에 대한 권한이 없기 때문에 발생하는 문제다.

alter user dcl_test default tablespace users quota unlimited on users;

이때는 이렇게 테이블스페이스 공간을 사용할 수 있도록 해줘야만 한다.
unlimited를 하면 공간의 제약이 없는 건데, 크기는 알아서 제한을 걸어주면 되는 부분.
Pasted image 20241111144007.png
그럼 이렇게 테이블에 데이터를 넣는 것도 가능해진다.
참고로 유저는 자신이 create를 해서 만든 테이블에 대해서는 자유로운 권한을 얻는다.
즉, 따로 drop 권한을 안 줘도 본인이 만든 것에 대해서는 삭제가 가능하다.

SELECT * FROM user_tab_privs;

Pasted image 20241111145449.png
이런 식으로 권한 확인이 가능하다.
내가 현재 접속한 유저로 관련된 권한들에 대한 정보를 확인한다.
dba로서 확인하고 싶다면, dba로 접속하고 dba_tab_privs를 검색하면 된다.
Pasted image 20241111145625.png
유저를 바로 삭제하려 했지만 안 된다.
확인해보니, 이것도 이름을 만들 때 c##를 명시해서 하는 것이랑 비슷한 이슈이다.

alter session set "_oracle_script"=true;

그래서 이걸 다시 설정하고 해주면 해결된다.

REVOKE

REVOKE create session FROM DCL_TEST CONTAINER=all;

권한 삭제는 revoke from이다.
근데 cdb 관련 이슈로 권한 삭제가 또 안 됐다.
그래서 뒤에 컨테이너 all을 명시했다.
Pasted image 20241111152050.png
테스트를 해보니까 알게 된 건데, 유저가 drop되면 그 놈의 권한도 같이 날아간다.
drop 시 cascade를 써줘야 그 놈이 만든 객체도 다 날아간다고 한다.

참고