Govern/Sql developer -DML,DDL,제약

07-06(화) 뷰 시퀀스 시노님 인덱스 사용자권한

Mary's log 2021. 7. 6. 10:35

※ 개발 수업 정리글입니다. 꾸준히 정리할 예정이고 틀린 부분이 있다면 언제든지 댓글 환영입니다.


DDL테이블 변경   ALTER TABLE 

 

CASCADE 옵션

ALTER TABLE 테이블명 DROP ~ CASCADE ;

끝에 CASCADE 붙여서 제약조건 삭제가능

 

책 318쪽 예제

CREATE TABLE DEPT05
(DEPTNO NUMBER(2) CONSTRAINT DEPT05_DEPTNO_PK PRIMARY KEY,
DNAME VARCHAR2(15),
LOC VARCHAR2(15));
INSERT INTO DEPT05(DEPTNO,DNAME,LOC)
VALUES(10,'인사','서울');
COMMIT;

----->DEPT05 테이블 생성 완료

 

CREATE TABLE EMP05
(EMPNO NUMBER(4) CONSTRAINT EMP05_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(15),
DEPTNO NUMBER(2)
CONSTRAINT EMP05_DEPTNO_FK REFERENCES DEPT05(DEPTNO));

INSERT INTO EMP05(EMPNO,ENAME,DEPTNO) VALUES(1000,'John',10);
COMMIT;

----->EMP05테이블 생성완료

 

ALTER TABLE DEPT05
DROP PRIMARY KEY;-->부모테이블 DEPT05삭제하러하면 에러발생

ALTER TABLE DEPT05
DROP PRIMARY KEY CASCADE;-->>CASCADE쓰면 FK제약조건 삭제가능
-->>제거된거 확인하기 위한 SQL
SELECT TABLE_NAME,CONSTRAINT_TYPE,
CONSTRAINT_NAME,R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN('DEPT05','EMP05');

 

 

제약조건 활성화 / 비활성화

ALTER TABLE 테이블명

DISABLE | ENABLE CONSTRAINT 제약조건명 [CASCADE] ;

 

321쪽 (예제)

--->FK제약조건 비활성화하기

ALTER TABLE EMP05
DISABLE CONSTRAINT EMP05_EMPNO_PK;

 

--->확인하기

SELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME, STATUS
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ( 'EMP05' );

 

--->FK제약조건 다시 활성화하고, 확인하면 ENABLED로 바뀌어있음

ALTER TABLE EMP05
ENABLE CONSTRAINT EMP05_EMPNO_PK;

 

 


11장 기타 스키마 객체.pdf

객체 : table도 객체. scott 계정에서 쓸 수 있는게 table객체, 뷰 객체, 시퀀스 객체, 시노님 객체 등등 있음

        뷰랑 시노님은 이런게 있다 정도고, 시퀀스 중요하게 보기

 

 뷰 

-물리적인 테이블(EMP,DEPT)에서 필요한 것만 뽑아낸, 논리적인 테이블

-선택적으로 접근 제한

-보안과 관련된 민감한 데이터를 접근 제한

-매번 복잡한 SQL문을 사용하지 않고, 뷰를 작성하고 난 후, 뷰를 사용하면 쉬워짐

-뷰는 SYS계정에서 권한 부여받아야함 [ sys계정에서 grant creat view to scott; ]

 

SELECT EMPNO,ENAME,D.DNAME,D.DEPTNO
FROM EMP E JOIN DEPT D
ON E.DEPTNO=D.DEPTNO
WHERE E.DEPTNO=20;

-->바로하면 안됨

 

뷰 생성  ( CTAS랑 비슷함.. CVAS일까나)

CREATE [OR REPLACE] VIEW 뷰이름 [별칭 가능]
AS
SELECT ~ 서브쿼리 ;

[WITH CHECK OPTION [CONSTRAINT 제약조건명]]

[WITH READ ONLY      [CONSTRAINT 제약조건명]]  ;

 

CREATE VIEW EMP_VIEW                            --EMP_VIEW라는 뷰를 생성해라.
AS                                                          --~로써
SELECT EMPNO,ENAME, D.DNAME, D.DEPTNO --사원번호,사원명,부서명,부서번호를
FROM EMP E JOIN DEPT D                         --조인
ON E.DEPTNO=D.DEPTNO                          --조인
WHERE E.DEPTNO=20;                               --EMP의 사번이 20인 레코드의

--뷰2생성, 원래 EMP컬럼개수8개고 SAL제외7개만, 이때 EMP에서 뽑은 컬럼명들을, 그대로 뷰의 컬럼명으로 가져감

CREATE VIEW EMP_VIEW2
AS
SELECT EMPNO,ENAME, JOB,MGR,HIREDATE,COMM,DEPTNO
FROM EMP; 

--뷰2의  컬럼 개수 확인-세부정보로 가면 썼던 SQL볼 수 있음

SELECT * FROM EMP_VIEW2;

--한 계정 안에 만든 뷰이름 보여주고 사용된 서브쿼리 보기

SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

 

생성된 뷰를 확인하는 방법 
[ USER_VIEW 데이터사전 조회 ]
SELECT  *  FROM USER_VIEWS  ; 

뷰 수정

-뷰는 없으면 CREATE 생성되고, 뷰가 존재하면 REPLACE 덮어쓰기

-뷰는 ALTER로 수정하는게 아니고 REPLACE로 덮어써야함

-POSTGRES DB 같은 경우 기존에 뷰가 있으면 REPLACE 안될수 있어서
 아래와 같은 SQL을 CREATE REPLACE 바로 위에 써준다

DROP VIEW IF EXISTS 테이블;
DROP VIEW IF EXISTS 테이블 CASCADE;

 

 

CREATE OR REPLACE VIEW 뷰이름
AS
SELECT ~ 서브쿼리 ;

 

<CTAS와 CVAS의 차이점>

TABLE : 새로운 테이블을 만들고, 원본은 변경이 안 됨

VIEW  : DML을 날리면 원본 데이터가 변경됨

 

--생성 아니면 바꿔라 다음뷰를, 근데 이미 있으니까 바꾸는거로됨 

CREATE OR REPLACE VIEW EMP_VIEW2
AS
SELECT EMPNO,ENAME,JOB,MGR,COMM,DEPTNO FROM EMP;
-뷰가 바뀌었는지 확인
DESC EMP_VIEW2;


뷰 종류

■ 단순뷰 : 1개의 테이블에서 필요컬럼만 뽑아와서 만듦

-DML 실행가능하고, 결과는 실제 기본 테이블에 반영됨===>그래서 꼭 ROLLBACK; 해주기

 ㄴ그룹함수, GROUP BY, DISTINCT이 포함됐을 경우엔 DML 불가

-함수를 사용할 땐, 반드시 컬럼별칭을 지정해줘야함

 

-새로 생성된 뷰 컬럼명을 따로 명시한 컬럼별칭으로 보여줄 수 있음

CREATE VIEW EMP_VIEW3( 사원번호, 이름, 월급 )
AS
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO=20;
SELECT * FROM EMP_VIEW3;

 

-->함수가 사용될 때는 반드시 컬럼별칭을 지정해야함, 안하면 에러

CREATE VIEW EMP_VIEW4
AS
SELECT DEPTNO,   SUM(SAL)     --SUM 함수때문임 바로 뒤에 별칭 써주면 뷰생성 가능
FROM EMP
GROUP BY DEPTNO;

-->또는 이렇게 뷰 뒤에 별칭을 전부 추가해도 됨

CREATE VIEW EMP_VIEW4 (사번, 총합)
AS
SELECT DEPTNO,SUM(SAL)
FROM EMP
GROUP BY DEPTNO;

 

CREATE VIEW EMP_VIEW5
AS
SELECT empno, ename,sal,deptno
FROM EMP;

DELETE FROM EMP_VIEW5
WHERE DEPTNO=10;
SELECT* FROM EMP;
SELECT* FROM EMP_VIEW5;
ROLLBACK;

 

-->뷰의 부서번호를 바꿔줄거임

CREATE VIEW EMP_VIEW6
AS
SELECT empno, ename,sal,deptno
FROM EMP
WHERE DEPTNO=30 ;
SELECT*FROM EMP_VIEW6;

UPDATE EMP_VIEW6       --뷰6의
SET deptno=40
WHERE EMPNO=7499;   --사번7499 ALLEN의 부서번호를 40으로 바꿔라
SELECT* FROM EMP;
SELECT* FROM EMP_VIEW6;

ROLLBACK;

 

 

■ 복합뷰 : 조인한 테이블에서 필요컬럼만 뽑아와서 만듦


~ WITH CHECK OPTION 제약조건 ; 

-WHERE절 조건에 만족하는 데이터만 DML문이 가능한 제약조건 추가된 뷰생성

CREATE OR REPLACE VIEW 뷰이름

AS

SELECT ~ 서브쿼리

WHERE 조건

WITH CHECK OPTION ;   --WHERE조건에 맞는 것만 DML할 수 있게

 

CREATE OR REPLACE VIEW EMP_VIEW6
AS
SELECT empno, ename,sal,deptno
FROM EMP
WHERE DEPTNO=30 
WITH CHECK OPTION ;

UPDATE EMP_VIEW6       
SET deptno=40
WHERE EMPNO=7499;    --체크옵션 안붙이고 했을땐 업뎃 됐지만 붙이면 안됨

 

 

~ WITH READ ONLY 제약조건 ; 

-어떠한 DML문도 불가능한 제약조건 추가된 뷰생성 ∴기본테이블 변경 불가능

CREATE OR REPLACE VIEW 뷰이름

AS

SELECT ~ 서브쿼리

WITH READ ONLY ;

 

CREATE OR REPLACE VIEW EMP_VIEW6
AS
SELECT empno, ename,sal,deptno
FROM EMP
WITH READ ONLY  ;

UPDATE EMP_VIEW6       
SET ENAME='개발'
WHERE DEPTNO=30;   --CANNOT ... READ-ONLY VIEW 리드온니뷰 때문에 업뎃불가

344쪽

 

 

 뷰 삭제 

DROP VIEW 뷰이름 ;

-기본테이블의 데이터에 영향이 가지 않음

DROP VIEW IF EXISTS 테이블;
DROP VIEW IF EXISTS 테이블 CASCADE;

시퀀스 sequence

-호출될 때 마다 자동으로 유일한 숫자 생성해서, 특정 컬럼값을 넘버링   

  ex) 게시글이 늘어날때마다 순차적으로 늘어나는 게시글번호, 점점 회원가입하면 늘어나는 회원번호 등등...

-시퀀스는 SYS에서 따로 권한부여 안 받음

 

■ 넘버링

CREATE SEQUENCE 시퀀스명
    START WITH      시작값(나중에수정X)
    INCREMENT BY  증가값
    MAXVALUE        최대값
    MINVALUE        사이클될때 다시 시작하는 값
    CYCLE               최대값 도달하면 MINIVALUES로 돌아갈지말지
    CACHE ;            미리 20개 저장해두는데 되도록 사용X

 

확인은 계정들어가면 중간쯤에 '시퀀스'폴더 있음

 

CREATE SEQUENCE DEPT_DEPTNO_SEQ
    START WITH 10
    INCREMENT BY 10
    MAXVALUE 100
    MINVALUE 5
    CYCLE
    NOCACHE;

 

NEXTVAL 과 CURRVAL

NEXTVAL는 다음값이고 CURRVAL는 최근값

-해당 시퀀스의 값을 증가시키고 싶다면 testSeq.NEXTVAL

-현재 시퀀스를 알고 싶다면 testSeq.CURRVAL

-반드시 NEXTVAL 먼저 호출, 나중에 CURRVAL 호출

 

348쪽

SELECT DEPT_DEPTNO_SEQ.NEXTVAL, DEPT_DEPTNO_SEQ.CURRVAL
FROM DUAL;

계속 클릭하면 5로 돌아가고 또 5로 돌아가고....

★★NEXTVAL는 실험 삼아 SELECT 실행하는 순간,  호출이 되어버리는 것★★

   ㄴ예시는 아래 테이블에시퀀스저장에 적어둠

 

음수값 시퀀스는 계속 호출하면 MINVALUE가 아니라 MAXVALUE로 돌아감

CREATE SEQUENCE DEPT_DEPTNO_SEQ2
    START WITH 100
    INCREMENT BY -10
    MAXVALUE 150
    MINVALUE 10
    CYCLE
    NOCACHE;
SELECT DEPT_DEPTNO_SEQ2.NEXTVAL, DEPT_DEPTNO_SEQ2.CURRVAL
FROM DUAL;

 

 

 

352쪽

USER_SQUENCES 데이터사전

생성된 시퀀스를 확인하는 방법
[ USER_SEQUENCES 데이터사전 조회 ]
SELECT * FROM USER_SEQUENCES WHERE sequence_name='시퀀스명' ;

DESC USER_SEQUENCES ;

 

시퀀스 수정

■ 넘버링을 수정

-뷰는 ALTER로 변경이 안되고, REPLACE로 덮어써야함

-레코드 삭제는 DELETE 객체나 컬럼 삭제는 DROP

-START WITH 옵션은 변경 불가능, 그 외는 전부 변경가능 ( START WITH 바꾸려면 삭제하고 재생성)

 

alter SEQUENCE 시퀀스명
 increment by 10
 cycle;                           ---->이건 수정됨

alter SEQUENCE  시퀀스명
 START WITH 5
 increment by 10
 cycle;                           ----> 이건 에러남. 왜? START WITH은 수정불가

 

★테이블에 시퀀스 값 저장 - 기억하기

-테이블에 시퀀스를 INSERT INTO VALUES 로 저장

 

CREATE TABLE DEPT06                         -- DEPT06테이블 생성
( DEPTNO NUMBER(4) PRIMARY KEY, 
  DNAME VARCHAR2(15),
  LOC VARCHAR2(15)    );

CREATE SEQUENCE DEPT_DEPTNO_SEQ4  -- SEQ4 시퀀스 생성
    START WITH 10                               --시작값는 10번부터
    INCREMENT BY 10                           --➤증가값 10씩. 10,20,30...
    NOCYCLE                                       --➤돌지 않고 쭉 증가
    NOCACHE;

 

INSERT INTO DEPT06 (DEPTNO,DNAME, LOC)    --➤DEPTNO가 시작값 10으로 붙음
    VALUES( DEPT_DEPTNO_SEQ4.NEXTVAL, '개발','서울'); 
INSERT INTO DEPT06 (DEPTNO,DNAME, LOC)   --➤(증가값 10이 붙어서) DEPTNO는 20
    VALUES( DEPT_DEPTNO_SEQ4.NEXTVAL, '인사','경기');
INSERT INTO DEPT06 (DEPTNO,DNAME, LOC)   --➤(증가값 10이 붙어서) DEPTNO는 30
    VALUES( DEPT_DEPTNO_SEQ4.NEXTVAL, '관리','부산');
COMMIT;

 

근데 만약 여기서 뭐 찾겠다고 시퀀스를 넣은 SELECT문을 반환한다면??
SELECT DEPT_DEPTNO_SEQ4.NEXTVAL FROM DUAL; --NEXTVAL이 반환됐기때문에 40으로 넘어가고
INSERT INTO DEPT06 (DEPTNO,DNAME, LOC)
VALUES( DEPT_dEPTNO_SEQ4.NEXTVAL, '관리','부산'); --➤다시 DEPTNO를 추가하면 40이 아닌 50으로 뜸

 

시퀀스 삭제

DROP SEQUENCE 시퀀스명 ;

-넘버링을 삭제

 


동의어 synonym

■ CREATE SYNONOYM 동의어 FOR 스키마.테이블명;

SELECT * FROM DEPT;
CREATE SYNONYM TESTDEPT
FOR SCOTT.DEPT;

 

■ DROP SYSNONYM 시노님명 ; 

DROP SYNONYM TESTDEPT;

 


인덱스

-간단하게 설명만 하고 넘어감 책367-369쪽

-인덱스: 빠른 데이터 검색을 위한 것

-SYS에서 따로 권한 안 받음

-보통 테이블에서 데이터 검색 시,

① 단순히 첨부터 끝까지 찾는 FULL SCAN방법 [ROWID] - 속도가 늦음

② B tree개념으로 중간값 생성해서 찾는 INDEX방법 - 속도가 빠름

CREATE INDEX 인덱스명

ON 테이블(컬럼) ; 

 

SELECT* FROM EMP WHERE ENAME='JONES';      --➤ F10 누르기
SELECT INDEX_NAME,TABLE_NAME                    --➤ F10 누르면 원래 아래 인덱스 떠야하는데 ㅋㅋ난 안됨..
FROM USER_INDEXES
WHERE TABLE_NAME IN('EMP','DEPT');

SELECT* FROM EMP WHERE EMPNO=7499;                 --➤ F10 누르면 원래 아래... 떠야하는데 ㅋㅋ난 안됨..
SELECT* FROM EMP WHERE TO_NUMBER(EMPNO)=7499;   --➤ 처리가 더 오래걸림
SELECT* FROM EMP WHERE EMPNO!=7499;                --➤ NOT인 경우에는 결과가많이 나오니까 INDEX를 쓰지않음
DROP INDEX EMP_ENAME_IDX;


사용자관리  생성,권한,ROLE

데이터베이스 보안

  1. 시스템 보안
    ㄴ인증 관련 ex)네이버ID하고 비번입력하여 로그인
  2. 데이터 보안
    ㄴ권한 관련

 

 

사용자 생성

CREATE USER 계정
IDENTIFIED BY 비밀번호;

 

(PDF예제)

CREATE USER user01     --➤ 계정이름이 USER01이고
IDENTIFIED BY ORACLE;  --➤ 비번이 ORACLE인,    계정생성

ALTER USER user01      --➤ USER01의
IDENTIFIED BY user01;  --➤ 비번을 USER01로 변경

 

 

권한

권한종류

①시스템 권한

GRANT  시스템권한1, 시스템권한2, ...    --➤[시스템권한1, 시스템권한2] 권한부여

TO 사용자계정 ;                               --➤이 사용자 계정한테

 

REVOKE 시스템권한1, 시스템권한2, ...     --➤[시스템권한1, 시스템권한2] 권한 회수

FROM 사용자계정 ;                            --➤이 사용자 계정한테

 

시스템 권한 조회

SELECT * FROM SESSION_PRIVS ;

 

GRANT CREATE SESSION,CREATE TABLE
TO user01;

 

"insufficient privileges" --권한부여를 못 받았을때 오류메시지

 

--➤SCOTT계정에서 DNAME한테만 JUPDATE권한부여

GRANT UPDATE(dNAME)
ON DEPT
TO USER01;

--➤USER01계정에서 변경시도

UPDATE SCOTT.DEPT
SET LOC='AAA' ;                --➤LOC는 권한부여 못받아서 안됨
UPDATE SCOTT.DEPT
SET DNAME='인사'
WHERE DEPTNO=40 ;         --➤DNAME은 권한부여 받아서 업뎃 가능

 

■ ~  WITH GRANT OPTION ;

권한 부여 조건을 주는 문구..

*REVOKE하면 연쇄 취소 가능

 

 WITH ADMIN OPTION ;

권한 부여 조건을 주는 문구..

*REVOKE하면 연쇄 취소 불가능

 

===>위 두개는 되도록 안 쓰고, 특히 ADMIN은 조심해서 써야함

 

②객체 권한

GRANT  시스템권한1, 시스템권한2, ...

ON 객체명

TO 사용자계정 ;

 

 

책390쪽

ROLE

-편리하게 권한을 관리할 수 있게, 권한에 대한 묶음. 전체회수 가능, 활성비활성도 가능

주로 CONNECT와 RESOURCE...

-빌트인 롤(=기본적으로 오라클에 저장되어있는 롤) : 

CONNECT  = CREATE SESSION

RESOURCE = CREATE TABLE , CREATE SEQUENCE, / 시퀀스는 리소스 안에 이미 들어가있어서 따로 권한부여를 안 받았지만, 뷰나 시노님은 리소스에 빠져있기 때문에 먼저 권한부여를 받아야함

 

CREATE ROLE CLERK ;        --➤ 클럭이란 ROLE를 만들어줌. 클럭 롤 안엔 아무것도 없음

GRANT CREATE SESSION, CREATE TABLE TO CLERK;  --➤ 클럭 롤에 권한을 묶어서 넣어줌

GRANT SELECT, INSERT ON SH.SALES TO CLERK;  --➤ 클럭 롤에 SLELECT, INSERT도 권한 묶어서 줌

GRANT CLERK TO KIM ; --➤ 클럭 롤이 갖고 있던 권한을 김에게 전부 권한을 줌

 

 

--➤SYS계정접속

CREATE USER user02
IDENTIFIED BY user02;                --➤ 계정생성
grant connect, resource to user02; --➤ ROLE이용해서 권한부여해야만 테스트성공 뜸

--➤접속+로 계정추가