database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38538 게시물 읽기
No. 38538
ALETER TABLE .. PARTITION TRUNCATE 명령 실행시 권한문제
작성자
오완규(cocon)
작성일
2011-05-03 22:23ⓒ
2011-05-03 22:47ⓜ
조회수
11,838

개발서버에서 테스트하느라 DBA계정으로 파티션 테이블을 생성했습니다. 당연히(!)  DBA계정은 잘되지만

일반사용자가 이 테이블에 데이터를 삭제하거나 적재해야하는 업무라 업무전용 계정( ECOS_027)이 따로 부여되어있는 상황입니다.

사용자 계정으로 이 테이블을 조작하거나 삭제하는 것은 파티션을 명시하면 되지만, 아래와 같이  truncate 쓰려고하면,

 

ALTER TABLE BOKECOS.T_027P119 TRUNCATE PARTITION P20094;

ORA-01031: Insufficient privileges..
권한이 없다고 나옵니다.

 

특정 테이블에 대해서 truncate (ALTER TABLE)권한을 부여할 수 있는지 궁금합니다.


인터넷을 뒤져보면 create table이나 drop 권한을 주면 된다고 하는데 너무 포괄적이라 불가하고.

delete를 쓰려고하면 아무리 파티션으로 분할되었다 하지만 3억건을 지웠다 쓰기는 무리같네요.

선배님들의 고견 부탁드립니다.

 

참고로 테이블 생성 스크립트

CREATE TABLE BOKECOS.T_027P119_NTS

(

 CYCLE            VARCHAR2 (2) NOT NULL,

 TIME             VARCHAR2 (10) NOT NULL,

 DATA_GUBUN       VARCHAR2 (1) NOT NULL,

 UPCHE            VARCHAR2 (30) NOT NULL,

 NUM_TYPE         VARCHAR2 (5) NOT NULL,

 DATA_VALUE       NUMBER (18,2),

 DATA_STATE       VARCHAR2 (2),

 DATA_STEP        VARCHAR2 (5),

 CREATE_TYPE      VARCHAR2 (5),

 Z_CREATE_DATE    DATE DEFAULT SYSDATE,

 Z_CREATE_USER_ID VARCHAR2 (15),

 Z_UPDATE_DATE    DATE,

 Z_UPDATE_USER_ID VARCHAR2 (15)

)PARTITION BY RANGE(TIME)

(

    PARTITION P20093 VALUES LESS THAN ('20094') TABLESPACE TSC0DT2,

    PARTITION P20094 VALUES LESS THAN ('20101') TABLESPACE TSC0DT2,

    PARTITION P20103 VALUES LESS THAN ('20104') TABLESPACE TSC0DT2,

    PARTITION P20104 VALUES LESS THAN ('20111') TABLESPACE TSC0DT2,

   

    PARTITION P20113 VALUES LESS THAN ('20114') TABLESPACE TSC0DT2,

    PARTITION P20114 VALUES LESS THAN ('20121') TABLESPACE TSC0DT2,

   

    PARTITION P20123 VALUES LESS THAN ('20124') TABLESPACE TSC0DT2,

    PARTITION P20124 VALUES LESS THAN ('20131') TABLESPACE TSC0DT2,

    PARTITION P20133 VALUES LESS THAN ('20134') TABLESPACE TSC0DT2,

    PARTITION P20134 VALUES LESS THAN ('20141') TABLESPACE TSC0DT2,

    PARTITION P20143 VALUES LESS THAN ('20144') TABLESPACE TSC0DT2,   

    PARTITION P20144 VALUES LESS THAN ('20151') TABLESPACE TSC0DT2,

    PARTITION P20153 VALUES LESS THAN ('20154') TABLESPACE TSC0DT2,   

    PARTITION P20154 VALUES LESS THAN ('20161') TABLESPACE TSC0DT2,

   

    PARTITION P20163 VALUES LESS THAN ('20164') TABLESPACE TSC0DT2,   

    PARTITION P20164 VALUES LESS THAN ('20171') TABLESPACE TSC0DT2,

   

    PARTITION P20173 VALUES LESS THAN ('20174') TABLESPACE TSC0DT2,   

    PARTITION P20174 VALUES LESS THAN ('20181') TABLESPACE TSC0DT2,       

   

    PARTITION P20183 VALUES LESS THAN ('20184') TABLESPACE TSC0DT2,   

    PARTITION P20184 VALUES LESS THAN ('20191') TABLESPACE TSC0DT2,

   

    PARTITION P20193 VALUES LESS THAN ('20194') TABLESPACE TSC0DT2,   

    PARTITION P20194 VALUES LESS THAN ('20201') TABLESPACE TSC0DT2

TABLESPACE TSC0DT2

NOLOGGING

;

 

/*파티션 인덱스 생성*/

CREATE INDEX T_027P119_PART_IDX ON T_027P119_NTS(TIME)

               LOCAL (

                      PARTITION P20093,

                      PARTITION P20094,

                      PARTITION P20103,

                      PARTITION P20104,

                      PARTITION P20113,

                      PARTITION P20114,

                      PARTITION P20123,

                      PARTITION P20124,

                      PARTITION P20133,

                      PARTITION P20134,

                      PARTITION P20143,

                      PARTITION P20144,

                      PARTITION P20153,

                      PARTITION P20154,

                      PARTITION P20163,

                      PARTITION P20164,

                      PARTITION P20173,

                      PARTITION P20174,

                      PARTITION P20183,

                      PARTITION P20184,

                      PARTITION P20193,

                      PARTITION P20194                     

            )TABLESPACE TSC0IX2 NOLOGGING NOCOMPRESS;

           

ALTER TABLE BOKECOS.T_027P119_NTS ADD CONSTRAINT T_027P119_NTS_PK PRIMARY KEY (CYCLE, TIME, DATA_GUBUN, UPCHE, NUM_TYPE)

USING INDEX TABLESPACE TSC0IX2 LOCAL  NOLOGGING NOCOMPRESS;

/*권한부여*/

GRANT SELECT ON BOKECOS.T_027P119 TO ECOS_USER;

GRANT DELETE ON BOKECOS.T_027P119 TO ECOS_027;

GRANT INSERT ON BOKECOS.T_027P119 TO ECOS_027;

GRANT SELECT ON BOKECOS.T_027P119 TO ECOS_027;

GRANT UPDATE ON BOKECOS.T_027P119 TO ECOS_027;

이 글에 대한 댓글이 총 3건 있습니다.

1.  특정 테이블에 대해서 truncate (ALTER TABLE)  권한을 사용자에게 부여할 수 없읍니다.

 

2.  따라서,  이 문제를 해결하기 위해서는 다음과 같이 간접적으로 권한을 부여 하면 됩니다.

 

DBA 계정에서 테이블이나 테이블 파티션을 truncate 하는 프로시져를 만들고, 이 프로시져의 실행 권한을 사용자에게 주어여 합니다. 

 

3.  만약 사용자가  truncate 해야 할 테이블 이름과 파티션 이름이 변한다면, 이 것들을 프로시져에서 변수로 받아 들여야 합니다.  그리고, 프로시져에서 'ALTER TABLE ... TRUNCATE PARTITION ...' 문장을 Dyanmic SQL 로 처리 해야합니다.

 

이와 같이, 사용자가 테이블이름과 파티션 이름을 입력할 수 있는 프로시져를 만들때는, 사용자가 truncate 할 수 있는 테이블 혹은 테이블 파티션 들을 제한하기 위해, DBA 계정에 (사용자, 테이블 이름, 파티션이름) 에 대한 'TRUNCATE 권한 테이블'을 만들어야 합니다. 

 

그 다음에, 프로시져 안에, 사용자가 입력한 테이블 파티션이 'TRUNCATE 권한 테이블'에 있는지를 확인하는 필터를 만들어야 합니다.  만약 없으면, 사용자에게 경고(?) 를 주고 'ALTER TABLE' 문장을 실행하지 않으면 되겠죠.

 

hopper(bunny)님이 2011-05-04 09:16에 작성한 댓글입니다.
이 댓글은 2011-05-04 12:10에 마지막으로 수정되었습니다.

hopper님 감사합니다. 많은 도움이 되었습니다.^^

오완규(cocon)님이 2011-05-04 13:06에 작성한 댓글입니다.

다음과 같은 프로지저를 생성하고 권한을 부여했습니다

CREATE OR REPLACE procedure SP_T_027P119_PART_TRUNCATE(INTIME IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE T_027P119_NTS TRUNCATE PARTITION ' || INTIME;
END SP_T_027P119_PART_TRUNCATE;

GRANT execute ON BOKECOS.SP_T_027P119_PART_TRUNCATE TO ECOS_027;
 

오완규(cocon)님이 2011-05-06 11:27에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38541트리거 3초에 200-300회 작동시 DB 과부하가 일어날까요? [2]
이민수
2011-05-06
5229
38540문자열이 포함되어 있는 컬럼에 데이터형 셀렉트 질문입니다... [3]
박경배
2011-05-06
3994
38539토드 같은 디비툴에서 다중 디비 접속 재질문...db link 말고는 방법이 없는지요? [1]
아이니
2011-05-04
3648
38538ALETER TABLE .. PARTITION TRUNCATE 명령 실행시 권한문제 [3]
오완규
2011-05-03
11838
38536토드 같은 툴에서 다중 디비 접속 어떻게 하는지... [2]
아이니
2011-05-03
4438
38535데이터별 다른 조건 [4]
진희
2011-05-03
4244
38534초당 3천~6천건의 insert시 100만건에서 서버 뻗는 현상 [2]
최지훈
2011-05-03
4207
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다