DB 연습하기 - 12

오늘·2021년 5월 5일
0

DB

목록 보기
12/14

계정만 만들면 DB 접근 가능한가?

-> 아니요. 권한을 부여 해야 가능합니다.


Grant

-> 사용자에게 시스템 권한을 부여하기 위해서 사용한다.
privilege_name = 권한 이름

grant privilege_name|role
To user_name
[with Admin option];

만일 user_name 대신 public 을 기술하면 모든 사용자에게 해당 시스템 권한이 부여된다. public 이란 DB 내에 있는 모든 계정을 의미하기 때문에!

-- 현재 사용하는 사용자(계정) 보기
show user;
-- 현재 관리자(system) 계정 사용 중이기 때문에 user 계정 생성이 가능하다
-- 하지만 접근 권한이 없기때문에 (Session이 안만들어졌기 때문에) 접속은.. 불가하다.
create user tester1 identified by 123;
-- 권한 부여하기(세션 할당하기)
grant create session to tester1;

-- 계정 만들고 권한 여러개 주기
create user tester2 identified by 1234;
grant create session, create table,
      create view, create sequence to tester2;

계정 생성 후 생성된 계정에 접속하기

  1. 왼쪽 상단 '접속'부분의 + 누르기
  2. name은 알아서 적고 사용자 이름 / 비밀번호에 설정한 내용으로 입력 후 접속
  • tester1 계정에 접속
-- 현재 유저 확인하기
show user; -- USER이(가) "TESTER1"입니다

-- 테이블 만들어보기
-- but 테이블을 만들 수 있는 권한은 부여받지 않았기 때문에 오류
create table emp ( empno number(4) );
  • tester2 에 접속
-- 현재 유저 확인
show user; -- USER이(가) "TESTER2"입니다.
-- 이번에는 권한은 있는데 공간이 없다는 오류가 난다,,,ㅎ
create table emp( empno number(4), ename varchar2(8) );

해결방법

계정을 생성해주고 접근할 수 있게 해줬다면, 작업 공간을 주어야! 그 내부에서 뭔가를 할 수 있다.

  1. unlimited : 제한을 두지 않고 할당해주기
    alter user [유저명] default tablespace [테이블스페이스] quota unlimited on [테이블스페이스];
    ex) alter user myuser default tablespace users quota unlimited on users;

  2. 특정 용량만큼만 테이블스페이스 할당하기
    alter user [유저명] quota [용량] on [테이블스페이스];
    ex) alter user myuser quota 30M on users;

공간 확보후 다시 작업해보기

tester2 에 접속해서 테이블 생성 / 삽입을 해보니 오류출력없이 잘 된다

create table emp( empno number(4), ename varchar2(8) );
insert into emp values (1000, '홍' );
insert into emp values (1001, '권' );

연습하기 01

  1. system (관리자계정) 에서 새로운 사용자 계정 만들기
-- tester3 유저 만들기
create user tester3 identified by 1234;
-- 접근 권한 부여 (세션을 만들어주고, 테이블과 뷰를 만들 수 있는 권한)
grant create session, create table, create view to tester3;
-- 작업공간 주기
-- (user라는 테이블공간 100M를 tester3에 할당하겠다) 
alter user tester3 Quota 100M on users;
grant unlimited tablespace to tester3;
  1. 만들어진 계정에 접속해 user 명 확인하기
show user;
--> USER이(가) "TESTER3"입니다. (확인)
  1. 테이블 만들고 값 넣어 보기
-- 테이블 만들기
create table emp (
    empno number(4),
    ename varchar2(10) );
-- 값 넣기
insert into emp values ( 101, '진' );

연습하기 02

  1. 사용자 계정 생성, 권한 부여, 공간 부여
-- 계정 생성
create user deptAdmin identified by 1234;
-- 사용자에게 DB에 접근할 권한 부여(여러 권한을 부여하고)
-- 다른 계정에도 자기가 부여받은 '권한'을 줄 수 있는 권한 : with admin option
-- -- 함수를 생성할 수 있는 권한 : create procedure
grant create user, drop user, drop any table,
      create session, create table, create view,
      create sequence, create procedure to deptAdmin
      with admin option;
-- 작업 공간 주기
alter user deptAdmin quota 100M on users;
grant unlimited tablespace to deptAdmin;
  1. 권한이 제대로 실행되는지 확인
show user;
-- > USER이(가) "DEPTADMIN"입니다.

-- 부여된 권한 사용해보기
-- 테이블 만들어보기
create table emp ( empno number(4), ename varchar2(10) );
-- 값 넣어보기
insert into emp values ( 101, '진' );
-- 유저 생성권한 사용해보기
create user dept_Person1 identified by 1234;
-- 유저 drop 해보기
drop user dept_Person1;
-- 만든 유저에게 접근권한 줘보기
create user dept_Person1 identified by 1234;
grant create session to dept_Person1;

-- 관리자에게 부여받지 않은 권한은 다른 계정에도 줄 수 없다.
grant query rewrite to dept_Person1; -- 오류

객체 권한

특정 객체에 조작을 할 수 있는 권한이다. 객체 소유자는 개체에 대한 모든 권한을 가진다.


다른 곳에서 현재 테이블을 검색

  1. 먼저 테이블이 있는 곳에서 권한을 부여해준다.
-- dept테이블의 select 권한을 tester2에게 부여한다.
grant select on dept to tester2;
  1. 불러올 곳에 가서 select로 검색
-- system 의 dept를 검색하는 것이다. 라고 명시해줘야함
select * from system.dept;

다른 곳에서 현재 테이블을 수정

  1. 권한을 준다
-- dept의 주인인 system이
-- tester3번에게 select, insert 권한을 부여하겠다.
grant select, insert on dept to tester3;
  1. 불러올 곳( tester3 )에 가서 확인하기
-- 권한 받은 내용 확인
select * from system.dept;
insert into system.dept values ( 80, '마케팅', '서울' );

-- 권한 받지 않은 내용을 실행하면 오류난다 당연히
delete from system.dept where deptno=80; -- 에러

다른 곳에서 현재 테이블을 변경

  1. 권한주기
-- deptAdmin 에게 emp 접근 권한을 아래와 같이 주겠다.
grant select, insert, delete, update on emp to deptAdmin;
  1. 일단 하나 실행시켜봐서 잘 권한이 넘어갔나 확인
select * from system.emp;

스키마

객체를 소유한 사용자명을 의미한다. 객체명 앞에 소속 사용자명을 기술합니다

  • 스키마를 명시적으로 지정하여 테이블 조회하기
    select * from tester.dept;
    .
    하지만 지금까지 우리는 객체를 기술할 때 스키마를 생략하며 테이블을 조회했고,
    select * from dept; 결과 또한 제대로 출력되었다.

왜일까? -> 자동으로 자기 소유의 테이블 내에서 검색하는 거겠거니.. 라고 오라클이 알아서 처리해줬기 때문이다.
-- 현재 사용자가 다른 사용자에게 부여한 권한 정보 조회
select * from user_tab_privs_made;
-- 현재 사종자가 자신에게 부여된 권한 정보 조회
select * from user_tab_privs_recd;

REVOKE : 사용자 권한 뺏기

  1. 권한 회수
  2. 권한을 부여한 곳(사용자)만 가능하다
  3. 해당 사용자가 다른 부서로 이동하거나, 직급이 변경되어 권한을 바꿔야할 때
-- test2에게서 권한 회수
revoke select on dept from tester2;

-- 아까 select, insert on dept 권한을 tester3에게 줬었는데
-- insert 만 회수하기
revoke insert on dept from tester3;

-- 주지도 않은 권한 뺏기
revoke delete on dept form tester3; --에러에러에러

롤을 사용한 권한 부여

미리 권한을 묶어서 역할(role)을 만들어 놓고, 사용자에게 맞는 역할을 주는 것.

사전 정의된 role의 종류

  1. Connect role
    사용자가 데이터베이스에 접속 가능하도록 하기 위해, 가장 기본적인 시스템 권한 8개를 묶어놓은 것이다.
alter session
create cluster
create database link
create sequence
create session
create synonym
create table
create view
  1. Resource role
    사용자가 객체(테이블, 뷰, 인덱스)를 생성할 수 있도록 하기 위해서 시스템 권한을 묶어 놓은것
create cluster
create procedure
create sequence
create table
create trigger
  1. DBA role
    사용자들이 소유한 DB 객체를 관리하고, 사용자들이 작성 변경 제거 할 수있도록 하는 모든 권한을 가진다. 즉 시스템 자원을 무제한적으로 사용하며, 시스템 관리에 필요한 모든 권한을 부여할 수 있는 강력한 권한을 가진 역할이다.
-- 역할 부여하기
-- 1. 사용자 만들기
create user person_1 identified by 1234;
-- 2. 권한을 묶음(역할)으로 부여
grant connect, resource to person_1;


-- 사용자에게 부여된 역할 알아보기
-- 테이블 이름이 %role% 이라고 되어있는 것들 모두 보기
-- 딕셔너리 안에 데이블 이름이 role이라고 되어있는 것 모두 보기
select * from dict where table_name like '%ROLE%';

롤 관련 데이터 딕셔너리 확인

-- 롤 관련 데이터 딕셔너리
-- 롤이 부여된 시스템 권한 정보
select * from role_sys_privs;
-- 롤에 대한 테이블의 권한 정보
select * from role_tab_privs;
-- 사용자가 접근 가능한 역할 정보
select * from user_role_privs;
-- 사용자 소유의 오브젝트 중 col에 부여된 오브젝트 권한 정보
select * from user_col_privs_made;
-- 사용자에게 부여된 특정 컬럼에 대한 오브젝트 권한 정보
select * from user_col_privs_recd;

사용자 롤 정의

사용자는 create role 명령어로 다음 형식에 따라 롤을 생성할 수도 있다.

create role 역할_이름;
grant 권한_이름 to 역할_이름;

예) 회사에서 알바 / 사원 / 대리 / 과장 / 사장이 가져야할 권한이 다르니까 권한을 지정해서 각 역할에 권한을 미리 부여해 놓는것

-- 역할 만들기
create role alba;
-- 권한주기
grant create session to alba;
grant select on emp to alba;

-- 사용자 계정 만들기
create user shin identified by 1234;
-- 사용자 계정에 역할 부여하기
grant alba to shin;

0개의 댓글