[ORACLE] EXP/IMP 백업/복구

[■DataBase/OO ORACLE OO]
[출처] : http://www.syuos.codns.com/?mid=study&a ··· %3D11561

백업 복구  export / import



- 테이블 재구성 : Row migration 이 많이 발생하는 경우, 빈 블럭이 많은 경우, fragmentation이 많이 발생하는 경우,
                        경합을 최소화 하기위해 등 테이블 재구성시 사용

============================================================================================================
export

table export
exp system/비번 tables=(테이블명, 테이블명) grants=y indexes=y

user export
:사용자의 모든 객체를 덤프
exp system/비번 file=백업명.dmp owner=사용자명 grants=y rows=y compress=y


full export
: DBA 사용자가 전체 데이타베이스 덤프하고자 할때
exp system/비번 full=y file=덤프명.dmp grants=y rows=y

=============================================================================================

import

table import
imp system/비번 file=덤프명.dmp fromuser=이전사용자명 tables=(테이블명,테이블명)
빈 테이블만 복구
imp system/비번 file=덤프명.dmp fromuser=이전사용자명 tables=dept
다른사용자에게 복구
imp system/비번 file=덤프명.dmp fromuser=이전사용자명 touser=현재사용자명 tables=(테이블명)



imp system/비번 file=덤프명.dmp
크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] ENCODE, DECODE

[■DataBase/OO ORACLE OO]

Select utl_encode.TEXT_DECODE('amV1c2FkbWlu','WE8ISO8859P1', 1) From Dual

Select utl_encode.TEXT_ENCODE('1234qwer','WE8ISO8859P1', 1) From Dual

크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 분석함수 이용한 누적,합계,비율 구하기

[■DataBase/OO ORACLE OO]
테이블 table_123에서 점이 1100인 것의
 
select mngbr, cifno, jikwonno, janamt
, row_number() over(partition by jikwonno order by mngbr, cifno ) accum -- 직원별 순차번호
, sum(janamt) over(partition by jikwonno order by mngbr, cifno rows between unbounded preceding and current row) accum1  -- 점,직원별/ 고객번호순 잔액의 누적
, sum(janamt) over(partition by jikwonno) accum_tot  -- 점,직원별 잔액의 합계
, round(ratio_to_report(janamt) over(partition by jikwonno), 2)*100 ratio_tot -- 점,직원별 잔액이 차지하는 비율
from   table_123
where  mngbr = 1100

[출처] 오라클 분석함수 - 누적,합계,비율구하기 |작성자 아직이군


분석함수가 약한 나에게 한줄기 빛이되신 아직이군님께 감사드립니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] Toad 'IN' is not a valid integer value 해결 방법

[■DataBase/OO ORACLE OO]
mt1716님 블로그 펌 : http://mt1716.egloos.com/8442935

최근에 알려진 토드 8.6 대 버젼이 오라클 10G 패치로 인해 생기는 'IN' is not a valid integer value 에
러를 FIX하는 방법입니다.

버그의 원인은 오라클 패치로 인해 ALL_ARGUMENTS가 변경되서 입니다.

1) SYS 로 로그인 합니다.
2) 아래의 view를 생성합니다. (ALL_ARGUMENTS_TOAD)

CREATE OR REPLACE VIEW ALL_ARGUMENTS_TOAD
(OWNER, OBJECT_NAME, PACKAGE_NAME, OBJECT_ID, OVERLOAD,
ARGUMENT_NAME, POSITION, SEQUENCE, DATA_LEVEL,
DATA_TYPE, DEFAULT_VALUE, DEFAULT_LENGTH, IN_OUT, DATA_LENGTH,
DATA_PRECISION, DATA_SCALE, RADIX, CHARACTER_SET_NAME, TYPE_OWNER,
TYPE_NAME, TYPE_SUBNAME, TYPE_LINK, PLS_TYPE, CHAR_LENGTH,
CHAR_USED, SUBPROGRAM_ID)
AS
SELECT
u.name, /* OWNER */
NVL(a.PROCEDURE$,o.name), /* OBJECT_NAME */
DECODE(a.PROCEDURE$,NULL,NULL, o.name), /* PACKAGE_NAME */
o.obj#, /* OBJECT_ID */
DECODE(a.overload#,0,NULL,a.overload#), /* OVERLOAD */
a.argument, /* ARGUMENT_NAME */
a.position#, /* POSITION */
a.SEQUENCE#, /* SEQUENCE */
a.LEVEL#, /* DATA_LEVEL */
DECODE(a.TYPE#, /* DATA_TYPE */
0, NULL,
1, DECODE(a.charsetform, 2, 'NVARCHAR2', 'VARCHAR2'),
2, DECODE(a.scale, -127, 'FLOAT', 'NUMBER'),
3, 'NATIVE INTEGER',
8, 'LONG',
9, DECODE(a.charsetform, 2, 'NCHAR VARYING', 'VARCHAR'),
11, 'ROWID',
12, 'DATE',
23, 'RAW',
24, 'LONG RAW',
29, 'BINARY_INTEGER',
69, 'ROWID',
96, DECODE(a.charsetform, 2, 'NCHAR', 'CHAR'),
100, 'BINARY_FLOAT',
101, 'BINARY_DOUBLE',
102, 'REF CURSOR',
104, 'UROWID',
105, 'MLSLABEL',
106, 'MLSLABEL',
110, 'REF',
111, 'REF',
112, DECODE(a.charsetform, 2, 'NCLOB', 'CLOB'),
113, 'BLOB', 114, 'BFILE', 115, 'CFILE',
121, 'OBJECT',
122, 'TABLE',
123, 'VARRAY',
178, 'TIME',
179, 'TIME WITH TIME ZONE',
180, 'TIMESTAMP',
181, 'TIMESTAMP WITH TIME ZONE',
231, 'TIMESTAMP WITH LOCAL TIME ZONE',
182, 'INTERVAL YEAR TO MONTH',
183, 'INTERVAL DAY TO SECOND',
250, 'PL/SQL RECORD',
251, 'PL/SQL TABLE',
252, 'PL/SQL BOOLEAN',
'UNDEFINED'),
DEFAULT$, /* DEFAULT_VALUE */
deflength, /* DEFAULT_LENGTH */
DECODE(in_out,NULL,'IN',1,'OUT',2,'IN/OUT','Undefined'), /* IN_OUT */
LENGTH, /* DATA_LENGTH */
PRECISION#, /* DATA_PRECISION */
DECODE(a.TYPE#, 2, scale, 1, NULL, 96, NULL, scale), /* DATA_SCALE */
radix, /* RADIX */
DECODE(a.charsetform, 1, 'CHAR_CS', /* CHARACTER_SET_NAME */
2, 'NCHAR_CS',
3, NLS_CHARSET_NAME(a.charsetid),
4, 'ARG:'||a.charsetid),
a.type_owner, /* TYPE_OWNER */
a.type_name, /* TYPE_NAME */
a.type_subname, /* TYPE_SUBNAME */
a.type_linkname, /* TYPE_LINK */
a.pls_type, /* PLS_TYPE */
DECODE(a.TYPE#, 1, a.scale, 96, a.scale, 0), /* CHAR_LENGTH */
DECODE(a.TYPE#,
1, DECODE(bitand(a.properties, 128), 128, 'C', 'B'),
96, DECODE(bitand(a.properties, 128), 128, 'C', 'B'), 0), /* CHAR_USED */
a.PROCEDURE# /* SUBPROGRAM ID */
FROM obj$ o,argument$ a,USER$ u
WHERE o.obj# = a.obj#
AND o.owner# = u.USER#
AND (owner# = USERENV('SCHEMAID')
OR EXISTS
(SELECT NULL FROM v$enabledprivs WHERE priv_number IN (-144,-141))
OR o.obj# IN (SELECT obj# FROM sys.objauth$ WHERE Grantee# IN
(SELECT kzsrorol FROM x$kzsro) AND privilege# = 12))
/

3) 다시 사용하던 유져ID로 아래와 같이 private synonym을 생성합니다.
CREATE SYNONYM all_arguments FOR sys.all_arguments_toad;

위와 같이 생성하면 정상적으로 작동합니다.
확인해본결과 TOAD 7버젼에서는 위에처럼 변경하지 않아도 정상으로 작동합니다.

Quest에서 패치를 받는법도 있다는데 다운받을수 없는분을 위해 알려드립니다.
국내에는 아직 잘 알려지지 않은버그인것 같습니다.
================================================================================================

SYNONYM 권한 생성 스크립트 SYS에서 실행
GRANT CREATE synonym TO 계정명;

SYNONYM 생성 스크립트 사용할 계정 로그인 후 실행
CREATE SYNONYM all_arguments FOR sys.all_arguments_toad;

앞으론 생고생이 적어 지겠네 ㅎㅎ
크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 동적쿼리 생성하여 INSERT

[■DataBase/OO ORACLE OO]

CREATE OR REPLACE PROCEDURE PROC_CONVERT_TABLE

   P_USER_NAME IN VARCHAR2,
   P_TABLE_NAME IN VARCHAR2
)
IS
tmpVar NUMBER;
P_CO_NAME VARCHAR2(200);
P_STR_SQL VARCHAR2(4000);

/******************************************************************************
   NAME:       PROC_CONVERT_TABLE
   PURPOSE:   

   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2009-06-18          1. Created this procedure.

   NOTES:

   Automatically available Auto Replace Keywords:
      Object Name:     PROC_CONVERT_TABLE
      Sysdate:         2009-06-18
      Date and Time:   2009-06-18, 오전 9:09:45, and 2009-06-18 오전 9:09:45
      Username:         (set in TOAD Options, Procedure Editor)
      Table Name:       (set in the "New PL/SQL Object" dialog)

******************************************************************************/
 CURSOR c1 IS
 select column_nm.column_name
 from user_tables, (
     select table_name, column_name, data_type,data_length
     from All_tab_columns
     where owner = P_USER_NAME
     ) column_nm
 where user_tables.table_name = column_nm.table_name
 and user_tables.table_name like P_TABLE_NAME
 and column_name not in ('SMN', 'AY', 'FN');
 
BEGIN

       OPEN c1;
           LOOP
              FETCH c1 INTO P_CO_NAME;
              EXIT WHEN c1%NOTFOUND;

               BEGIN       
     P_STR_SQL := 'INSERT INTO TEMP_2 '
     || ' SELECT SMN, AY, FN,  ' || '''' ||P_CO_NAME|| ''', '
     || ' MAX(DECODE('||P_CO_NAME||', '||P_CO_NAME||', '||P_CO_NAME||')) '
     || ' FROM TEMP '
     || ' GROUP BY SMN, AY, FN '
     || ' ORDER BY SMN';
     EXECUTE IMMEDIATE P_STR_SQL; //쿼리를 동적으로 생성하여 처리할 수 있다.
               END;
           END LOOP;
       CLOSE c1;


   tmpVar := 0;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END PROC_CONVERT_TABLE;


/

크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 오라클 테이블, 컬럼 가져오기

[분류없음]

/* 테이블 정보 가져오기 */
select table_name from user_tables where table_name like '[TABLE_NAME]';

/* 컬럼 정보 가져오기 */
select column_nm.*
from user_tables, (
    select table_name, column_name, data_type,data_length
    from All_tab_columns
    where owner = '[USER_NAME]'
    ) column_nm
where user_tables.table_name = column_nm.table_name
and user_tables.table_name like '[TABLE_NAME]'

크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 수정가능 조인 뷰

[■DataBase/OO ORACLE OO]

수정가능 조인 뷰를 통한 업데이트

insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');
insert into test values('','aa','');

insert into test values('','bb','');
insert into test values('','bb','');

select * from test

/* Formatted on 2009/05/18 20:15 (Formatter Plus v4.8.6) */
select r from
(
SELECT ROWNUM r,  tt.b
  FROM (SELECT   b
            FROM TEST
        GROUP BY b) tt
)

/* Formatted on 2009/05/18 20:03 (Formatter Plus v4.8.6) */
-- rowid 로  순번
UPDATE TEST t
SET t.a = (SELECT r
                FROM (SELECT ROWNUM r, ROWID rd, a.*
                        FROM TEST a) tt
               WHERE t.ROWID = tt.rd)
 WHERE t.ROWID = (SELECT rd
                    FROM (SELECT ROWNUM r, ROWID rd, a.*
                            FROM TEST a) tt
                   WHERE t.ROWID = tt.rd)

-- rank 함수 사용
UPDATE TEST t
SET t.a = (SELECT r
                FROM (SELECT rank() over(partition by a.b order by rownum) r, ROWID rd, a.*
                        FROM TEST a) tt
               WHERE t.ROWID = tt.rd)
 WHERE t.ROWID = (SELECT rd
                    FROM (SELECT ROWNUM r, ROWID rd, a.*
                            FROM TEST a) tt
                   WHERE t.ROWID = tt.rd)      
       
     
SELECT rank() over(partition by a.b order by rownum) "rank", ROWID rd, a.a, a.b, rank() over(partition by a.b order by rownum) "rank"
FROM TEST a
GROUP BY rownum, rowid, a.a, a.b
order by rownum

A          B          C         
1          aa                   
2          aa                   
3          aa                   
4          aa                   
5          aa                   
6          aa                   
7          aa                   
8          aa                   
9          aa                   
10         aa                   
1          bb                   
2          bb                   


크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 날짜검색

[■DataBase/OO ORACLE OO]
/* Formatted on 2009/05/18 14:06 (Formatter Plus v4.8.6) */
SELECT *
FROM [테이블명]
WHERE [컬럼명] BETWEEN TO_date ('2009-05-01 00:00:01',  'YYYY-MM-DD HH24:MI:SS')
                        AND TO_date ('2009-05-18 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 별칭 규칙

[■DataBase/OO ORACLE OO]
Alias
별칭에 대소문자, 공백, 한글, 특수문자를 포함하면 인용부호("")를 사용
영문자로만 표현시 칼럼명 as 영문자 로 인용부호 없이 사용가능. 하지만 정의된 별칭은 무조건 대문자로만 출력.
크리에이티브 커먼즈 라이센스
Creative Commons License

[ORACLE] 사용자 접근 권한 - GRANT, REVOKE

[■DataBase/OO ORACLE OO]

[펌] http://www.koug.net/bbs/zboard.php?id=o ··· no%3D241

* 시스템 권한(System Privilege): 데이터 베이스를 액세스할 수 있다.
* 객체 권한(Object Privilege)  : 데이터 베이스 객체 내용을 조작할 수 있다.
1. System Privilege? --> DBA권한
   - Create new users ( CREATE USER )
   - Remove users     ( DROP USER )
   - Remove tables    ( DROP ANY TABLE )
   - Backup tables     ( BACKUP ANY TABLE )

2. Creating User
   CREATE USER scott
   IDENTIFIED BY tiger ;
  
3. system privilege에서의 GRANT
   GRANT privilege [, privilege...]
   TO user [, user...]
   [WITH ADMIN OPTION] ;
   * WITH ADMIN OPTION : dba가 권한을 주는 user에게도 admin 권한을 줄 수 있다.
   * user system privilege(DBA 가 USER에게 할당 할 수 있는 권한)
     CREATE SESSION    : 테이터베이스에 connect하는 권한
     CREATE TABLE      : 테이블 만드는 권한
     CREATE SEQUENCE  : sequence 만드는 권한
     CREATE VIEW        : view 만드는 권한
     CREATE PROCEDURE : stored prcedure, function 만드는 권한
     GRANT create table, create sequence, create view
     TO scott
     --> scott에게 table, sequence, view만드는 권한을 준다.
  
4. ROLE : 사용자에게 부여할 수 있는 관련 권한을 하나로 묶어 명명한 그룹
           Grant를 줄 role user를 만든후 그 role user에 grant를 주고,
           role user의 권한을 각각의 user에게 넘겨준다.
   ① SQL> CREATE ROLE manager ;
      Role created.
   ② SQL> GRANT create table, create view TO manager ;
      Grant succeeded.
   ③ SQL> GRANT mananger TO brake, clock ;
      Grant succeeded.
     
5. User Password 변경하기
   ALTER USER user IDENITIFIED BY password ;
   예) ALTER USER scott IDENTIFIED BY lion ;
  
6. Object Privileges?
   * 객체마다 다르다.
   * 소유자는 객체에 대한 모든 권한을 갖는다.
   * 소유자는 자신의 객체에 대한 특정 권한을 부여할 수 있다.
7. Object Privilege에서의 GRANT
   GRANT object_priv [(columns)| ALL]
   ON object
   TO {user|role|PUBLIC}
   [WITH GRANT OPTION] ;
   * sue, rich 라는 user에게 emp 테이블을 select 권한을 준다.
     GRANT select
     ON emp
     TO sue, rich ;
   * scott, manager라는 user에게 dept 테이블의 dname,loc 컬럼을 update할 수 있게  권한을 준다.
     GRANT update (dname, loc)
     ON dept
     TO scott, manager ;
    
   * WITH GRANT OPTION
     GRANT select, insert
     ON dept
     TO scott
     WITH GRANT OPTION ;
     --> scott에게 dept 테이블의 select, insert권한을 주면서 scott가 다른 유저에게도
         이 권한을 줄 수 있게 한다.
    
   * PUBLIC : 모든 유저에게 권한을 부여한다.
     GRANT select
     ON alice.dept
     TO PUBLIC ;
     --> 모든유저에게 alice가 만든 dept 테이블의 select권한을 준다.
    
   * 모든 유저에게 모든 object권한을 주기
     GRANT ALL
     ON emp
     TO PUBLIC ;
    
8. 권한 없애기 (REVOKE)
   REVOKE {privilege [, privilege...] | ALL}
   ON object
   FROM {user[, user...]|role|PUBLIC}
   [CASCADE CONSTRAINTS]
  
   REVOKE select, insert
   ON dept
   FROM scott ; --> scott에게서 dept테이블의 select, insert권한을 없앤다.  
   * CASCADE CONSTRAINTS : 이 옵션을 않쓰면 revoke할 때 forien key
     관계의 table을  revoke할 수 없다.
  
9. Privilege Grant를 볼 수 있는 Data Dictionary
   ROLE_SYS_PRIVS        : System privilege 권한에 대한 정보
   ROLE_TAB_PRIVS        : table(object) privilege 권한에 대한 정보
   USER_ROLE_PRIVS      : role정보
   USER_TAB_PRIVS_MADE : 내가 다른 사람에게 준 TABLE 권한에 대한 정보
   USER_TAB_PRIVS_RECD : 내가 다른 사람에게 받은 TABLE 권한에 대한 정보
   USER_COL_PRIVS_MADE : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보
   USER_COL_PRIVS_RECD : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

크리에이티브 커먼즈 라이센스
Creative Commons License