alter (3)

계정 생성



create user 유저네임 identified by 패스워드;
 

권한 부여, 조회

 resource, connect 는 일반적인 것을 다 사용할 수 있다. (DDL, DML 등)




grant resource, connect to 유저네임;
grant DBA to 유저네임;

select * from dba_sys_privs where grantee='유저ID';

테이블스페이스 지정




alter user 유저네임 default tablespace 테이블스페이스명;
alter user 유저네임 temporary tablespace 임시테이블스페이스명;
 

계정 삭제

 cascade 를 명시하면 유저네임과 관련된 모든 데이터베이스 스키마가 데이터 사전으로부터 삭제되고 모든 스키마 객체도 물리적으로 삭제된다.



drop user 유저네임 cascade;


오라클에서 테이블에 새로운 PRIMARY KEY를 추가하고 이를 FK로 만들어주고 싶었다.

그러다가 그만 ORA-02270 에러를 만나게 되었다.

만나게 된 상황은 이렇다.

 

테이블 A와 B가 있다.

테이블 A는 a라는 PK가 있고 테이블 B는 (a, b)를 복합PK로 가지고 있었다.

자, 여기서 A와 B테이블에 컬럼c를 추가하고 복합PK로 만들어주려했다.

즉, A의 PK는 (a, c), 그리고 B의 PK는 (a, b, c)가 되는것이다. 그리고 B의 a, c는 FK로 A의 a, c를 참조해야한다.

 

이를 하기위해서 생각했던 순서는 아래와 같다. 

 

1. 테이블 A, B의 PK를 DROP한다.

2. 테이블 A, B에 컬럼c를 추가한다.

3. 테이블 A의 PK로 (a, c)를 선언한다. 

3. 테이블 B의 a를 FK로 선언하면서 A의 a를 참조하도록 한다.

 - alter table B add foreign key (a) references A(a);

4. 테이블 B의 c를 FK로 선언하면서 A의 c를 참조하도록 한다.

 - alter table B add foreign key (c) references A(c);

5. 테이블 B의 PK로 (a, b, c)를 선언한다.

 

하지만 3번에서 02270 에러를 만나게 되었다.

이 에러는 UNIQUE KEY나 PK가 아닌것을 참조하려고 했기 때문에 발생하는 에러이다.

그래서 생각해보니 테이블 A의 PK는 a나 c가 아닌 (a, c)인 것이다.

하여 3, 4번 과정을 묶어서 테이블 B의 FK로 B의 (a, c)가 A의 (a, c)를 참조하도록 설정하였더니 문제가 해결되었다.

 - alter table B add foreign key (a, c) references A(a, c);


테이블 백업을 할때에 export / import 를 이용할 수도 있지만 단순하게 rename 명령어를 이용할 수도 있습니다. 또한 create ~ as select ~ 를 이용할 수도 있습니다.

하지만 오늘은 테이블 명을 변경하고 새로 테이블을 생성함으로써 백업을 할 수 있는 방법을 소개하도록 하겠습니다. 참고로 이 방법은 blob데이타가 많은 경우에 상당히 유용합니다.


Step by Step

1) Query table name and index names linked to the table you want to backup

2) Rename table name

3) Rename indexes' name ( if specified explicitly when it is created )

4) Rename constraints' name ( if specified explicitly when it is created )

4) Use the same DDL used to create the renamed table


※ This way is very simple and fast then using "create table ~ as select * from ~" statement when the table has a huge blob data.



1) 변경하고자하는 테이블에 어떤 인덱스들이 있는지 조회합니다.

SQL > select index_name, table_name from user_indexes;


2) 테이블명을 변경합니다.

SQL > rename old_table to new_table;


3) 인덱스명을 변경합니다. ( 인덱스명이 자동생성된 것이 아닌 경우에만 )

SQL > alter index pk_old_table rename to pk_new_table;


4) 제약사항명을 변경합니다. ( 제약사항명이 자동생성된 것이 아닌 경우에만 )

SQL > select * from user_cons_columns where table_name='{table_name};

SQL > alter table {table name} rename constraint {constraint name} to {new constraint name}


5) 기존 테이블을 생성했던 DDL을 사용하여 테이블을 새로 생성합니다.

SQL > create table .........