제약 조건은 테이블에 올바르지 않은 부적절한 데이터가 저장되는 것을 방지하기 위해서 테이블을 생성할 때 각 컬럼에 대해서 정의하는 여러가지 규칙을 의미한다.
이것은 데이터베이스의 설계 단계에서 데이터의 무결성을 보장 받기 위한 방법이다.
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] PRIMARY KEY,
컬럼명 데이터타입,
...
);
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] UNIQUE,
컬럼명 데이터타입,
...
);
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] NOT NULL,
컬럼명 데이터타입,
...
);
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] CHECK(조건식) , 컬럼명 데이터타입,
...
);
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] REFERENCES 부모테이
블명(컬럼명),
컬럼명 데이터타입,
...
);
테이블단에서 외래키를 설정할 경우 문법이 다름
CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입, 컬럼명 데이터타입,
...,
[CONSTRAINT 제약조건명] FOREIGN KEY(컬럼명)
REFERENCES 부모테이블명(컬럼명)
);
*객체 무결성 ?
foreign key 제약조건의 추가 옵션
create table emp02
(empno number(04) constraint emp02_empno_pk primary key,
ename varchar2(15),
deptno number(2)
constraint emp02_deptno_fk references dept02(deptno) ON DELETE CASCADE);
create table emp02
(empno number(4), constraint emp02_empno_pk primary key,
ename varchar2(15),
deptno number(2),
constraint emp02_deptno_fk foreign key(deptno) references dept02(deptno) on delete set null);DROP TABLE 테이블명 [CASCADE CONSTRAINTS];
Flashback Drop (스킵)(이 버전에서 안됨)
생성된 테이블에 대한 구조를 변경할 수 있으며 ALTER TABLE 명령문을 사용한다. 테이
블에 대한 구조 변경은 컬럼의 추가,삭제 및 컬럼의 타입이나 길이 변경, 제약조건 추가,삭
제등이 가능하다. 테이블에 대한 구조 변경은 기존에 저장되어 있던 데이터에 영향을 주게
된다.
ALTER TABLE 테이블명
ADD ( 컬럼명 데이터타입 [, 컬럼명 데이터타입]);
ALTER TABLE 테이블명
MODIFY ( 컬럼명 데이터타입 [, 컬럼명 데이터타입]);
ALTER TABLE 테이블명
DROP ( 컬럼명 [,컬럼명] );
ALTER TABLE 테이블명
ADD [CONSTRAINT 제약조건명] 제약조건타입(컬럼명);
테이블 레벨단에 제약조건 추가하듯이 같은 문법으로 추가하면 된다. 컬럼명을 명시해야함.
테이블 레벨 제약조건 설정방법과 동일한 문법이기 때문에 컬럼 레벨 방식만 가능한 NOT NULL은 ADD로 추가가 불가능하고 MODIFY로 추가할 수 있다.
NOT NULL 제약조건 추가 문법
ALTER TABLE 테이블명
MODIFY ( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] NOT NULL )
ALTER TABLE 테이블명
DROP PRIMARY KEY|UNIQUE(컬럼)|
CONSTRAINT 제약조건명 [CASCADE];
ALTER TABLE dept03
DROP PRIMARY KEY;
ALTER TABLE dept03
DROP CONSTRAINT dept03_deptno_pk;
ALTER TABLE 테이블명
DISABLE|ENABLE CONSTRAINT 제약조건명 [CASCADE];
보니까 제약조건 이름을 사용할 때는 대부분 앞에 CONSTRAINT를 붙이는 것 같다.
데이터 사전 (Data Dictionary)
CREATE [OR REPLACE] VIEW 뷰이름 [(alias[,alias] ...)]
AS
서브쿼리
[WITH CHECK OPTION [CONSTRAINT 제약조건명]]
[WITH READ ONLY [CONSTRAINT 제약조건명] ];
뷰 생성 권한 없으면 생성이 안됨
ERROR MESSAGE : insufficient privileges
SCOTT 계정 만들 때 CONNECT(접속권한), RESOURCE(테이블생성권한) 만 GRANT했기 때문에 따로 뷰 권한을 줘야함.
뷰를 생성하면 테이블처럼 사용할 수 있음
약간 영구적인 사용하기 편한 테이블 느낌이 남.
CREATE OR REPLACE 구문을 사용
create or replace view emp_view2 (사원번호, 이름, 직업, 관리자번호, comm, 부서번호)
as
select empno, ename, job, mgr, comm, deptno from emp;
기본테이블(원본테이블)의 개수에 따라서 단순 뷰와 복합 뷰로 구분된다.
*모든 상황에서 단순 뷰의 DML 작업이 가능한 것은 아니다. 단순 뷰가 그룹함수,GROUP BY, DISTINCT 같은 표현식을 포함한 경우에는 DML 작업이 불가능하다.
CREATE VIEW EMP_VIEW6
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30;
SELECT시 부서번호가 30명인 사원이 6명이 출력된다.
SELECT * FROM EMP_VIEW6;
UPDATE EMP_VIEW6
SET DEPTNO = 40
WHERE EMPNO = 7499;
1명이 40번으로 변경되었다.
SELECT시 뷰에서 제외되었다.
CREATE OR REPLACE VIEW EMP_VIEW6
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30
WITH CHECK OPTION;
CREATE OR REPLACE VIEW emp_view6
AS
SELECT empno,ename,sal, deptno
FROM emp
WITH READ ONLY;
DROP VIEW 뷰이름;
CREATE SEQUENCE 시퀀스명
[ START WITH n]
[ INCREMENT BY n]
[ MAXVALUE n | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE | NOCYCLE ]
[ CACHE n | NOCACHE ]
START WITH n
INCREMENT BY n
CURRVALL
NEXTVAL (중요)
(중요) create sequence 시퀀스이름. NEXTVAL
SELECT dept_deptno_seq.NEXTVAL, dept_deptno_seq.CURRVAL
FROM dual;
USER_SEQUENCES 데이터 사전 에 등록됨
ALTER SEQUENCE 시퀀스명
[ INCREMENT BY n]
[ MAXVALUE n | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE | NOCYCLE ]
[ CACHE n | NOCACHE ]
INSERT문 사용시 같이 사용하는 형태로 쓰인다.
INSERT INTO DEPT06 (DEPTNO, DNAME, LOC)
VALUES (DEPT_DEPTNO_SEQ. NEXTVAL, '개발', '서울');
DROP SEQUENCE 시퀀스명;
동의어는 db 객체에 대한 별칭을 뜻한다.
다른객체에 접근할 때 스키마.객체 형식으로 접근한다. 이 스키마.객체 형식을 별칭으로 대체하는 것을 시노님이라고한다.
CREATE [PUBLIC] SYNONYM 동의어
FOR 스키마.객체;
-- sys 계정
-- tester 계정 생성 및 권한부여
create user tester identified by tester;
alter user tester identified by tester;
grant connect, resource to tester;
oracle sql developer에서 접속정보 삭제는 db의 사용자 계정을 삭제하지는 않는다.
sys -> 다른 사용자 계정에서 삭제하면 계정이 삭제된다.
tester 계정에서 scott의 컬럼에 접근하는게 안된다.
select * from scott.emp; <-- 오류
-- scott 계정에서 (접근할 컬럼이 있는 계정에서)
GRANT
select on dept
to tester;
select 권한만 부여한 것. insert시 insufficient privileges 오류메세지 발생 (권한부족)
-- SYS
GRANT create synonym
TO tester;
(oracle dba 자격시험 에 필요 따로 책이 있을 정도임)
개념만
다수의 사용자들이 데이터베이스에 저장된 데이터를 공유해서 사용한다.
따라서 보안을 위해서 오라클 db는 인증과 권한을 사용하여 개별 사용자들의 db 접근 및 사용에 적절한 보안을 유지시킨다.
인증 : 사용자 계정을 생성, 암호를 변경, 디스크 공간 할당 등 시스템 수준에서 db 접근 및 사용을 관리하는 것을 의미한다.
권한 : db 객체에 대한 사용자들의 접근 및 사용을 관리하는 개념
계정: 사용자 (sys가 추가) => 권한부여 (sys가 부여 grant, 회수도 가능 revoke )
CREATE USER 계정
IDENTIFIED BY 비밀번호;
ex) cott => tester 권한부여
grant select on dept to tester
grant insert ...
grant update ...
grant delete ...
user_grant 롤생성 <= grant select on dept to tester
grant insert ...
grant update ...
grant delete ...
grant user_rant to tester;
grant user_rant to tester2;
DBA가 권한을 부여 (SYS)
DB에 특별한 작업을 수행하는 것을 가능하게 해준다.
접속, 사용자생성, 테이블생성, 뷰생성 등
CREATE USER 새롭게 사용자를 생성하는 시스템 권한
DROP USER 사용자를 삭제하는 시스템 권한
DROP ANY TABLE 임의의 테이블을 삭제할 수 있는 시스템 권한
QUERY REWRITE 함수 기반 인덱스를 생성하는 시스템 권한
BACKUP ANY TABLE 임의의 테이블을 백업할 수 있는 시스템 권한
객체 수준에서의 권한
객체의 소유자가 권한을 부여 (객체란 테이블과 같은 것들)
select,insert,update,delete 같은 작업을 수행하는 것을 가능하게 해준다.
CREATE SESSION 데이터베이스에 접속할 수 있는 시스템 권한
CREATE TABLE 사용자가 테이블을 생성할 수 있는 시스템 권한
CREATE SEQUENCE 사용자가 시퀀스를 생성할 수 있는 시스템 권한
CREATE VIEW 사용자가 뷰를 생성할 수 있는 시스템 권한
CREATE PROCEDURE 사용자가 PL/SQL의 프로시저를 생성할 수 있는 시스템 권한
권한 할당 문법
GRANT 시스템권한[,시스템권한]
TO 사용자계정|role|PUBLIC;
권한 회수 문법
REVOKE 시스템권한[,시스템권한]
FROM 사용자계정|role|PUBLIC;
< 계정 생성 및 테이블 생성 >
1. user01 계정 생성 + 디벨로퍼에서 접속정보 저장
2. sys에서 user01에 접속권한 부여
3. sys에서 user01에 테이블 생성 권한 부여
4. sys에서 user01에 테이블저장공간을 사용할 권한을 부여
create user user01 identified by user01;
grant create session to user01;
grant create table to user01;
grant unlimited tablespace to user01;