KIC/ORACLE

[Oracle] 객체권한 및 데이터복원

octopengj 2020. 10. 12. 15:33
  • 객체권한

    • table, view, sequence, synonym, index

 

 

<문1>

  • 객체의 권한 종류를 조회하는 SQL?

    -> table_privilege_map(테이블)

  • 시스템 권한종류?

    -> system_privilege_map

SQL> conn sys/sys12345 as sysdba
연결되었습니다.
SQL> select * from table_privilege_map;

 PRIVILEGE NAME
---------- ----------------------------------------
         0 ALTER
         1 AUDIT
         2 COMMENT  // 주석(테이블 설계 => exerd)
         3 DELETE   // 삭제권한
         4 GRANT    // 권한부여
         5 INDEX
         6 INSERT   // DML권한
         7 LOCK
         8 RENAME   // 이름변경(테이블이름, 필드명 변경)
         9 SELECT   // 검색권한 -> 거의 주지 않고 대신에 뷰로 볼 수 있는 권한을 줌
        10 UPDATE   // 수정권한

 PRIVILEGE NAME
---------- ----------------------------------------
        11 REFERENCES
        12 EXECUTE              // 실행권한
        16 CREATE				
        17 READ
        18 WRITE
        20 ENQUEUE
        21 DEQUEUE
        22 UNDER
        23 ON COMMIT REFRESH
        24 QUERY REWRITE
        26 DEBUG

 PRIVILEGE NAME
---------- ----------------------------------------
        27 FLASHBACK           // 데이터 복구에 관련된 명령어
        28 MERGE VIEW
        29 USE
        30 FLASHBACK ARCHIVE

26 개의 행이 선택되었습니다.

 

권한을 줄때 -> 테이블(DML(insert, update, delete, select, view))

 

 

 

 

<문2>

관리자가 test4/test4, test5/test5, test6/test6 계정생성을 하고 connect, resource, create table권한을 부여하고test5가 test6에게 권한을 줄 수있도록 위임

 

형식) grant 권한종류,, on 적용테이블명 to 계정명 [with grant option]

 

SQL> create user test4 identified by test4;

SQL> create user test5 identified by test5;

SQL> create user test6 identified by test6;

SQL> grant connect, resource to test4, test5, test6;

 

SQL> create user test4 identified by test4;

사용자가 생성되었습니다.

SQL> create user test5 identified by test5;

사용자가 생성되었습니다.

SQL> create user test6 identified by test6;

사용자가 생성되었습니다.

SQL> grant connect, resource to test4, test5, test6;

권한이 부여되었습니다.	

 

테이블의 컬럼수(행) 확인할때는 select * from 테이블명 하지 말고 select count(*) from 테이블명으로 할것

실무에서 방대한 자료를 *로 불러내는 것은 어리석은 행동이다.

 

test5에게 권한부여

SQL> grant select, insert, update on b_dept2 to test5 with grant option;

 

SQL> grant select, insert, update on b_dept2 to test5 with grant option;

권한이 부여되었습니다.

 

test5가 test4에게는 insert test6에게는 select, update 권한을 부여하기

SQL> conn test5/test5

SQL> grant insert on scott.b_dept2 to test4;

SQL> grant select, update on scott.b_dept2 to test6;

 

SQL> conn test5/test5
연결되었습니다.

SQL> grant insert on scott.b_dept2 to test4;
권한이 부여되었습니다.

SQL> grant select, update on scott.b_dept2 to test6;
권한이 부여되었습니다.

scott 주의할 것 scott의 테이블을 사용하는 것이기 때문에 소유자명을 반드시 입력해야한다.

 

 

부여받은 권한 확인하기

SQL> conn test6/test6

SQL> select * from scott.b_dept2;

 

SQL> conn test6/test6
연결되었습니다.
SQL> select * from scott.b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        90 TESTING4       SEOUL4
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       SEOUL2
        80 TESTING3       SEOUL3

9 개의 행이 선택되었습니다.

 

수정도 가능하다

SQL> update scott.b_dept2 set loc='DALLS' where deptno=60;

 

SQL> update scott.b_dept2 set loc='DALLS' where deptno=60;

1 행이 갱신되었습니다.

SQL> select * from scott.b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        90 TESTING4       SEOUL4
        50 SUPPORT        KWANGJU
        60 TESTING        DALLS
        70 TESTING2       SEOUL2
        80 TESTING3       SEOUL3

9 개의 행이 선택되었습니다.

 

 

 

<문3> 위임권한 회수

scott이 test5에게 부여한 권한을 회수

SQL> conn scott/tiger

SQL> revoke select, update, insert on b_dept2 from test5;

 

SQL> conn scott/tiger
연결되었습니다.
SQL>  revoke select, update, insert on b_dept2 from test5;

권한이 취소되었습니다.

 

권한 회수 확인

 

SQL> conn test5/test5
연결되었습니다.
SQL> select * from scott.b_dept2;
select * from scott.b_dept2
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
SQL> conn test6/test6
연결되었습니다.
SQL> select * from scott.b_dept2;
select * from scott.b_dept2
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

test5가 권한을 회수당하면 test5가 test6에게 부여한 권한도 같이 회수 당한다.   <---> 시스템 권한과 반대다.

                                                         

 

 

<문4> 데이터 삭제

  • delete

  • truncate

  1. delete from 테이블명 (delete * from 아니다 주의)

    = 테이블의 내부데이터 삭제

    delete from 테이블명 where 조건식

    = 회원탈퇴에 사용

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
        14

SQL> delete from b_emp3;

14 행이 삭제되었습니다.

 

SQL> rollback; 하면 (DML)데이터 복구가 가능하다 commmit 전이라면

 

SQL> rollback;

롤백이 완료되었습니다.

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
        14

 

 

2. truncate table 삭제시킬테이블명;

= 테이블 내의 데이터를 삭제

SQL> truncate table b_emp3;

 

SQL> truncate table b_emp3;

테이블이 잘렸습니다.

SQL> rollback;

롤백이 완료되었습니다.

SQL> select * from b_dept3;
select * from b_dept3
              *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

데이터 복원이 안된다.

 

  • delete, truncate 공통점

    • 둘다 테이블내의 데이터를 삭제(테이블의 구조는 그대로 유지)

  • delete, truncate 차이점

    • delete: rollback으로 데이터 복원 가능

                DML계열

    • truncate: rollbakc으로 데이터 복원 불가능

                   DDL 계열 => 자동으로 commit

DDL계열과 DCL계열은 자동으로 commit 되므로 주의해서 사용해야 한다.

 

 

 

 

<문5> 데이터 삭제 drop

  • drop 문

  • drop table 삭제시킬 데이블명

테이블삭제 => 데이터삭제, 구조삭제(폴더 삭제) , 복원불가, DDL계열

SQL> drop table b_emp6;

SQL> select count(*) from b_emp6;

SQL> rollback;

 

sql>drop table b_emp6;
테이블이 삭제되었습니다.

SQL> select count(*) from b_emp6;
select count(*) from b_emp6
                     *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

sql>rollback
SQL> select count(*) from b_emp6;
select count(*) from b_emp6
                     *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

 

8i,9i 복구 불가 -> 10g이후부터 drop table으로 삭제해도 복구시키면 존재

 

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$zLbQG9V7RdGDDCBX32bq8A==$0 TABLE
       ==>삭제된 테이블을 보여준다.(휴지통에 보관된 상태)
BONUS                          TABLE
BUSER                          SYNONYM
B_DEPT2                        TABLE
B_EMP2                         TABLE
B_EMP3                         TABLE
B_EMP4                         TABLE

 

 

 

<문6> 삭제된 테이블이 휴지통에 들어가 있는 상태에서 조회

 

SQL> desc user_recyclebin

 

SQL> desc user_recyclebin
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME    // 테이블 삭제 후 이름        NOT NULL VARCHAR2(30)
 ORIGINAL_NAME  // 테이블 삭제 전 이름                 VARCHAR2(32)
 OPERATION                                          VARCHAR2(9)
 TYPE           // 오라클의 객체(타입)의 종류           VARCHAR2(25)
 TS_NAME                                            VARCHAR2(30)
 CREATETIME                                         VARCHAR2(19)
 DROPTIME       // 삭제된 시간                        VARCHAR2(19)
 DROPSCN        // 같은 테이블이라도 서로 내부적으로      NUMBER
                   구분해주는 고유번호(system change number)
 PARTITION_NAME                                     VARCHAR2(32)
 CAN_UNDROP                                         VARCHAR2(3)
 CAN_PURGE                                          VARCHAR2(3)
 RELATED                                   NOT NULL NUMBER
 BASE_OBJECT                               NOT NULL NUMBER
 PURGE_OBJECT                              NOT NULL NUMBER
 SPACE                                              NUMBER

 

 

 

 

<문7> 휴지통에 들어가 있는 테이블을 복원

 

형식) flashback table 복원시킬 테이블명 to before drop

 

SQL> flashback table b_emp6 to before drop;

 

sql>flashback table b_emp6 to before drop;
플래시백이 완료되었습니다.

sql>select count(*) from b_emp6;
  COUNT(*)
----------
        14

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
BUSER                          SYNONYM
B_DEPT2                        TABLE
B_EMP2                         TABLE
B_EMP3                         TABLE
B_EMP4                         TABLE
B_EMP6                         TABLE

 

 

 

 

<문8> 영구삭제시키는 방법 => 휴지통 거치지 않고 삭제

flashback 기술이 적용되지 않는다.

형식) drop table 삭제시킬 테이블명 [purge]

 

SQL> drop table b_emp3 purge;

SQL> show recyclebin

SQL> flashback table b_emp3 to before drop;

 

SQL> drop table b_emp3 purge;

테이블이 삭제되었습니다.

SQL> show recyclebin;   // 보여지는 것이 없다. 휴지통에 들어간게 애초에 없다. 

SQL> flashback table b_emp3 to before drop;
flashback table b_emp3 to before drop
*
1행에 오류:
ORA-38305: 객체가 RECYCLE BIN에 없음

 

 

 

 

<문9> 만약 같은 테이블을 여러개 삭제시킨경우 복원

 

SQL> create table t1(a number);

SQL> create table t1(a number);

테이블이 생성되었습니다.

 

SQL> drop table t1;

SQL> drop table t1;

테이블이 삭제되었습니다.

 

다음 테이블을 시간차 두고 생성 삭제 해보기

SQL> create table t1(a varchar2(10));

SQL> drop table t1;

 

SQL> create table t1(a date);

SQL> drop table t1;

 

SQL> create table t1(a number);

SQL> drop table t1;

 

SQL> create table t1(a varchar2(10));

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.

SQL> create table t1(a date);

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.

SQL> create table t1(a number);

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.

 

SQL> select * from tab; 로 확인

 

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$BCs+HUhgSAy8kkC+6ouBGw==$0 TABLE
BIN$K1Bh6xXBR6GysMWJ7yEZvQ==$0 TABLE
BIN$n+R2VWHeQnW901GDN+NIdQ==$0 TABLE
BIN$zGQh+rDnQaC3Uo1dld0DJA==$0 TABLE
BONUS                          TABLE
BUSER                          SYNONYM
B_DEPT2                        TABLE
B_EMP2                         TABLE
B_EMP4                         TABLE
DEPT                           TABLE
DEPT30                         VIEW

----------------------------------------------------
이하 생략

 

SQL> show recyclebin; 로 확인

 

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$n+R2VWHeQnW901GDN+NIdQ==$0 TABLE        2020-07-10:12:27:19
T1               BIN$BCs+HUhgSAy8kkC+6ouBGw==$0 TABLE        2020-07-10:12:27:01
T1               BIN$zGQh+rDnQaC3Uo1dld0DJA==$0 TABLE        2020-07-10:12:25:49
T1               BIN$K1Bh6xXBR6GysMWJ7yEZvQ==$0 TABLE        2020-07-10:12:23:52

삭제된 시간 확인이 가능하다.

 

 

SQL> flashback table t1 to before drop;

SQL> show recyclebin;

 

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$n+R2VWHeQnW901GDN+NIdQ==$0 TABLE        2020-07-10:12:27:19
T1               BIN$BCs+HUhgSAy8kkC+6ouBGw==$0 TABLE        2020-07-10:12:27:01
T1               BIN$zGQh+rDnQaC3Uo1dld0DJA==$0 TABLE        2020-07-10:12:25:49
T1               BIN$K1Bh6xXBR6GysMWJ7yEZvQ==$0 TABLE        2020-07-10:12:23:52

SQL> flashback table t1 to before drop;

플래시백이 완료되었습니다.

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$BCs+HUhgSAy8kkC+6ouBGw==$0 TABLE        2020-07-10:12:27:01
T1               BIN$zGQh+rDnQaC3Uo1dld0DJA==$0 TABLE        2020-07-10:12:25:49
T1               BIN$K1Bh6xXBR6GysMWJ7yEZvQ==$0 TABLE        2020-07-10:12:23:52

가장 최근에 삭제된 데이터순으로 복구된다.

 

 

 

 

 

<문10> 이미 복원시킬 테이블이 존재하는 경우(동일한 테이블, 동일명 테이블)

            (위의 문제에서 t1테이블을 만들고 삭제하고 반복하였다 그리고 이미 t1의 이름을 가진 테이블이 복원된 상태               이고 추가적으로 복원을 하려고하는데 t1으로는 불가하다)

 

어떻게 복원? => 복원을 시킬때 이름을 변경시켜 구분하여 복원시킨다.

 

형식) flashback tabel "휴지통의 테이블이름(RECYCLEBIN NAME)" to before drop rename to 새로운 테이블명

 

SQL> flashback table "BIN$BCs+HUhgSAy8kkC+6ouBGw==$0" to before drop rename to imsitest;

 

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$BCs+HUhgSAy8kkC+6ouBGw==$0 TABLE        2020-07-10:12:27:01
T1               BIN$zGQh+rDnQaC3Uo1dld0DJA==$0 TABLE        2020-07-10:12:25:49
T1               BIN$K1Bh6xXBR6GysMWJ7yEZvQ==$0 TABLE        2020-07-10:12:23:52

SQL> flashback table "BIN$BCs+HUhgSAy8kkC+6ouBGw==$0" to before drop rename to imsitest;

플래시백이 완료되었습니다.

SQL> desc imsitest;
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 A                                                  DATE

 

 

'KIC > ORACLE' 카테고리의 다른 글

[Oracle] 추가내용(관리자입장)  (0) 2020.10.12
[Oracle] 동의어, 권한  (0) 2020.10.12
[Oracle] 트랜잭션  (0) 2020.10.12
[Oracle] 인덱스, 시퀀스  (0) 2020.10.12
[Oracle] 뷰  (0) 2020.10.12