본문 바로가기

work/oracle

db컨트롤 퀴리문 정리

KOREAN_KOREA.KO16KSC5601
AMERICAN_AMERICA.US7ASCII

'시퀀스 생성
select 'create sequence SQ_'||tname ||' INCREMENT BY 1 START WITH 1 MAXVALUE 99999999999999999999999999 cycle;' from tab

SELECT 'DROP SEQUENCE ' || SEQUENCE_NAME || ';' FROM USER_SEQUENCES

'시퀀스 보기
Select * from user_sequences;

'컨스트레인트
SELECT * FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'PFGO01IT'

'user 테이블을 볼수 있도록 한다.
select table_name from user_tables

'컬럼 타입 변경
ALTER TABLE PFGK02IT MODIFY (JUDGE VARCHAR2(1) NOT NULL)

'PK 생성
ALTER TABLE PFGK02IT ADD CONSTRAINT PFGK02IT_PK PRIMARY KEY
(OP_PLN_S_DT, AST_CD, BATCH_NO,PROCESS_CD,
BATCH_NO_ORDER, JEJO_CD, RECORD_NO, UNIT_PROC_CD, JE_MTD_CD,
HNGMOK_CD, RNG_GB, STD_YN, REC_DT)

'UNIQUE 키 생성
ALTER TABLE PFGK02IT ADD CONSTRAINT PFGK02IT_UK UNIQUE (SULBI_SK_CD, SULBI_NO)

'UNIQUE KEY 삭제(3가지)
ALTER TABLE PFPA02MT DROP CONSTRAINT CONSTRAINT_NAME CASCADE
ALTER TABLE PFPA02MT DROP UNIQUE CASCADE(안됨)
ALTER TABLE PFPA02MT DROP UNIQUE(COLUMN_NAME) CONSTRAINT(CONSTRAINT_NAME)

'INDEX 삭제
DROP INDEX PFPA02MT_X1

'TABLE 삭제
DROP TABLE TABLE_NAME CASCADE CONSTRAINTS

select 'DROP TABLE '|| tname || ' CASCADE CONSTRAINT;' from tab

'테이블의 인덱스를 살핌
SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME = 'PFGK02IT'

ALTER TABLE PFGK02IT DROP CONSTRAINT PFGK02IT_uk CASCADE

PRIMARY KEY 삭제
ALTER TABLE PFGK02IT DROP PRIMARY KEY CASCADE

ALTER TABLE PFGJ01IT ADD (CLEAN_S_TIME VARCHAR2(12) NOT NULL, CLEAN_E_TIME VARCHAR2(12) NOT NULL,
EMP_ONE VARCHAR2(6) NOT NULL, EMP_TWO VARCHAR2(6))

DB에서 테이블 재 설정 순서
1. 테이블 명을 다른 이름으로 바꾼다.(기존 테이블 없어짐)
rename PFGO01IT TO PFGO01IT_OLD2

select 'rename '|| tname || ' to ' || tname || '_old;' from tab

2. 기존 테이블의 이름으로 테이블을 생성한 후 각 컬럼과 데이터를 다른 이름으로
생성된 테이블로 부터 가져온다.
CREATE TABLE PFGO01IT AS SELECT
OP_PLN_S_DT, AST_CD, BATCH_NO, PROCESS_CD, BATCH_NO_ORDER, JEJO_CD, SEQ, MEASURE_DT, MEASURE_TIME, SULBI_CD, SULBI_NO,
TW, GW, NW, BAD_QTY, OW_NW, OW_BAD_QTY, LENGTH, MEASURE_UNIT, INSU_EMP, INGE_EMP, MEASURE_EMP, GUM_EMP, OP_E_DT, OP_E_TIME,
ROLL_NO, UNIT_P_YN FROM PFGO01IT_OLD2

3. PK를 생성한다.
ALTER TABLE PFGO01IT ADD CONSTRAINT PFGO00IT_PK PRIMARY KEY
(OP_PLN_S_DT, AST_CD, BATCH_NO, PROCESS_CD, BATCH_NO_ORDER, JEJO_CD, SEQ)

4. 컬럼의 데이터 타입을 바꿀 때, 테이블에 존재하는 데이터를 지운후,
ALTER TABLE PFGO01IT MODIFY (ROLL_NO VARCHAR2(6))
를 수행하여 타입을 변경한다.

* 널을 허용하면서 PK역할을 하는 컬럼 생성 요령
- 널 포함 PK컬럼은 나머지 NOT NULL PK 컬럼과 함께 UNIQUE INDEX를 생성한다.
(PK는 생성하지 않음)

* 테이블 삭제
select 'drop table '||table_name||' cascade constraint;' from user_tables;

* 테이블 스페이스 생성
CREATE TABLESPACE namhae_data DATAFILE
'C:\ORAWIN95\datafile\data\namhae_data.dbf' SIZE 20M
AUTOEXTEND ON NEXT 10M DEFAULT STORAGE
( INITIAL 10K NEXT 10K MAXEXTENTS UNLIMITED PCTINCREASE 0 );

CREATE TABLESPACE namhae_index DATAFILE
'C:\ORAWIN95\datafile\index\namhae_index.dbf' SIZE 20M
AUTOEXTEND ON NEXT 10M DEFAULT STORAGE
( INITIAL 10K NEXT 10K MAXEXTENTS UNLIMITED PCTINCREASE 0 );

* 테이블 스페이스에서 인덱스 삭제
drop TABLESPACE namhae_index

* personnel oracle에 대한 ODBC 셋팅
id : ems
pwd : nccems
connecting string : 2:

* 테이블 백업, 데이터 백업
create database link link_name connect to user_name identified by pwd using 'alias';
예, create database link sein1 connect to ems identified by nccems using 'sein';
alias = tnsnames.ora 파일의 tns 이름

'다른 DB로부터 데이터 받아오기
select 'create table ' || tname || ' as select * from ' || tname || '@sein1;' from tab@sein1 <= link 이름
결과예) create table ACCESS_INFO as select * from ACCESS_INFO@sein;

'조건을 두어 데이터 받아오기
예1) create table ACCESS_INFO as select * from ACCESS_INFO@sein where colum_name = '';
예2) create table RESULT as select * from RESULT@namhae where id between 96000 and 100000;

* 등록된 user 보기(system/manager로 로그인 해야함)
SELECT * FROM dba_users

'외래키(FK)작성문
ALTER TABLE ANALYSIS_CLASS_INFO
ADD ( FOREIGN KEY (ANALYSIS_CLASS_ID)
REFERENCES ANALYSIS_CLASS
ON DELETE CASCADE )

'6월 두째주 토요일)
6(두째주), 13(세째주)
1:일요일, 2:월요일 ...7:토요일
select next_day(trunc(to_date('2000-12-20', 'YYYY-MM-DD'), 'month')+6,7) from dual

select to_char(next_day(trunc(sysdate, 'month') + 6, 7), 'YYYY-MM-DD') from dual

'현재일이 몇째주 무슨요일인가?
select DECODE(MOD(TO_CHAR(SYSDATE,'DD')/7,1),0,
DECODE( TO_CHAR(TRUNC(SYSDATE,'MONTH'),'DD') ,'일요일', TO_CHAR(SYSDATE,'DD')/7||'주', TO_CHAR(SYSDATE,'DD')/7 + 1 ||'주'),
TRUNC(TO_CHAR(SYSDATE,'DD')/7 + 1)||'주')||'_'||TO_CHAR(SYSDATE,'DAY') from dual

'MS_SQL문 : 현날짜에 한달 더하기
SELECT DATEADD(M, 1, DETDATE())

'sysnonym 생성 및 권한 주기 - 1
'DBA(system/manager)에서 만든 view, table, procedure, function 등
CREATE PUBLIC SYNONYM ZAA01MT FOR ZAA01MT;
'테이블은 execute 문을 실행하지 않음
--GRANT EXECUTE ON ZAA01MT TO PUBLIC;

'테이블 권한
--GRANT ALL ON ZAA01MT TO PUBLIC;

CREATE PUBLIC SYNONYM ZAA04MT FOR ZAA04MT;
--GRANT EXECUTE ON ZAA04MT TO PUBLIC;

CREATE PUBLIC SYNONYM ZAA05MT FOR ZAA05MT;
--GRANT EXECUTE ON ZAA04MT TO PUBLIC;

'sysnonym 생성 및 권한 주기 - 2
'특정 user의 view, table에 대한 권한 (public) 주기 : user.table
1. 우선 user에서 grant all on table_name to public으로 권한을 주고
system/manager에서 public sysnonym을 생성하면 다른 user에서 table 내용을
볼 수 있다.

예> CREATE PUBLIC SYNONYM ZAA01MT FOR pacc.ZAA01MT;
예> CREATE PUBLIC SYNONYM ZAA04MT FOR pacc.ZAA04MT;

'sysnonym 삭제
'DROP SYNONYM sysnonym_name

'권한(grant) 주기
1. all
예> grant all on Sab05mt TO PUBLIC

2. select
=> grant select on column_name1, column_name2 to user

3. update
=> grant update(column_name1, column_name2) to user(scott, manager)

'권한 회수(revoke)
' revoke select on column_name1, column_name2 from user

PACC : grant all on PAAD02MT TO PUBLIC

SYSTEM : CREATE PUBLIC SYNONYM PAAD02MT FOR PACC.PAAD02MT;

'hint 주는 방법
"/*+ INDEX_DESC(ASC) (TABLE_NAME INDEX_NAME) */"를 쿼리문에 넣는다.
예1> SELECT /*+ INDEX_DESC (PFCA01MT PFCA01MT_PK) */ * FROM PFCA01MT
예2> SELECT /*+ INDEX_ASC (PFCA01MT PFCA01MT_PK) */ * FROM PFCA01MT
'주의사항
"*+"는 꼭 붙여 쓴다.

'현재 쿼리문의 인덱스 사용 현황을 보는 방법

C:\Oracle\Ora81\rdbms\admin\utlxplan.sql 파일을 실행시킨 후
PLAN_TABLE 스키마로 현 USER에서 테이블을 생성한다.
GOLDEN에서 CRRL+P키를 누르면 실행된다.

*** 오라클 8i에 접속이 잘 안될 때 ***
tnsnames.ora의 세팅 중에서
CONNECT_DATA = (SID = JKOra)를
CONNECT_DATA = ("SERVICE_NAME = JKOra")
로 변경
(따옴표가 중요하며, JKOra는 접속하려는 데이터베이스명으로 함.)

**INDEX 생성 - index tablespace와 연결
CREATE INDEX PFGH01IT_IDX1 ON PFGH01IT(AST_CD, PROCESS_CD, BATCH_NO, BATCH_NO_ORDER)
tablespace tablespace_name

ALTER TABLE PFGH01IT
ADD CONSTRAINT PFGH01IT_PK
PRIMARY KEY (AST_CD)

ALTER TABLE PFGK03IT
ADD ( FOREIGN KEY (기록반복등록코드)
REFERENCES PFGK02IT ) ;

CREATE TABLE PFGB01MT
(PROCESS_CD NUMBER(10) NOT NULL,
PROCESS_NM VARCHAR2(100) NOT NULL
PROCESS_GB VARCHAR2(1))
STORAGE (INITIAL 200K NEXT 200K PCTINCREASE 0 MINEXTENTS 2 MAXEXTENTS UNLIMITED)
INITRANS 1 MAXTRANS 255

PCTINCREASE : 현재의 EXTENT가 이전 EXTENT에 대해 일정 비율로 증가하는 것을 나타냄
즉 PCTINCREASE를 10으로 하면 이전 EXTENT는 100일 경우 다음 EXTENT는 100+100*0.1=110
이 되는 것이다.
MINEXTENTS : 초기 EXTENT 수
MAXEXTENTS : 최대 EXTENT 수(V7.3 기본 MAXEXTENTS = 121)
(데이터가 많을 경우 문제 발생 가능성이 있음 UNLIMITED로 선언하라)

==> 데이터가 많을 경우 INITIAL, NEXT를 크게 잡아라
INITRANS : 초기에 지정한 테이블에 동시에 접속할 수 있는 사용자 수
MAXTRANS : 최대로 테이블에 동시에 접속할 수 있는 사용자 수
==> 최대 수가 넘으면 DB에서 자동으로 수를 늘린다.
ROLLBACK SEGMENT : ROLLBACK을 대비해 데이터를 저장하는 영역

*테이블 TO 테이블 입력방법
INSERT INTO TABLE_NAME1(COLUMN_NAME, ...)
(SELECT COLUMN, ... FROM TABLE_NAME2)

INSERT INTO PFPO01MT(DAILY_EMP_CD, WORK_EMP, WORK_NM, JUMIN_NO, IP_DATE, STATE_YN)
(SELECT DAILY_EMP_CD, WORK_EMP, WORK_NM, JUMIN_NO, IP_DATE, STATE_YN FROM PFPO01MT_1)

*순서
1.테이블 rename
2.신규 테이블 생성
3.데이터 porting(위 쿼리문 이용)
4.constraint 생성(PK, FK 등)
==> 데이터가 없으면 FK가 생성이 안됨.

constraints 삭제
ALTER TABLE PFPM01MT drop constraints constraints_name

* 멋있는 쿼리문
select ast_cd, process_cd, sum(1) from pfgb02mt
group by ast_cd, process_cd

* 스토어드 프로시져 실행식
예)execute DELETE_AST_PROCESS(175,1);

*DBA 권한 부여
GRANT DBA TO NPROD WITH ADMIN OPTION
--WITH ADMIN OPTION : ADMIN 권한을 가짐
GRANT ALL ON DBA_OBJECTS TO NPROD WITH GRANT OPTION
--WITH GRANT OPTION : 오브젝트를 다른 사용자에게 사용할 수 있는 권한을
줄 수 있음.

*INTERNAL/ORACLE
SYNONYM인 DBA_OBJECTS는 SYSTEM/MANAGER에서 GRANT을 줄 수 없고
INTERNAL에서만 줄 수 있다.

*권한 취소
REVOKE DBA FROM NPROD

grant select on table_name to user_name
grant all table_name to user_name
B유저에서 Grant select on B의 테이블명 To A유저명