Cute Happy Ghost
본문 바로가기
DB/Oracle

20201026_22 계정생성, 제약조건

by JENN_tech7 2020. 10. 26.
728x90
SMALL
  • 계정생성

 

 

 

  • 계정비밀번호 변경
ALTER USER test01 IDENTIFIED BY 4321;

 

 

 

 

 

  • 권한관리

사용자가 데이터베이스에서 행할 수 있는 것들을 의미한다.
큰 분류로 분류하면 다음과 같다.

  • 사용자 관리
  • 접속 관리
  • 테이블 관리
  • 인덱스 관리
  • 롤 관리
  • 그 외

권한을 부여하기 위한 문장은 다음과 같다.

GRANT 권한(혹은 롤) TO 사용자_이름;

권한을 회수하기 위한 문장은 다음과 같다.

REVOKE 권한(혹은 롤) FROM 사용자_이름

 

 

CONNECT랑 RESOURCE만 있으면 계정생성가능

 

 

 

 

  • 제약조건
CREATE TABLE account_info (
    id NUMBER PRIMARY KEY,
    email VARCHAR2(128)NOT NULL
);

INSERT INTO account_info(id, email) VALUES(123, 'abc@gmail.com');
INSERT INTO account_info(id, email) VALUES(124, 'abc@gmail.com');
INSERT INTO account_info(id, email) VALUES(125, NULL);

 

1 행 이(가) 삽입되었습니다.


명령의 7 행에서 시작하는 중 오류 발생 -
INSERT INTO account_info(id, email) VALUES(123, 'abc@gmail.com')
오류 보고 -
ORA-00001: unique constraint (TEST01.SYS_C007071) violated


1 행 이(가) 삽입되었습니다.


명령의 8 행에서 시작하는 중 오류 발생 -
INSERT INTO account_info(id, email) VALUES(125, NULL)
오류 보고 -
ORA-01400: cannot insert NULL into ("TEST01"."ACCOUNT_INFO"."EMAIL")

PRIMARY KEY는 같은값x

not null은 null값만 안되고 같은값입력 가능

 

  • 제약조건 테이블에 넣기 not null은 nn이라고 함
DROP TABLE account_info;
CREATE TABLE account_info (
    id NUMBER PRIMARY KEY,
    email VARCHAR2(128) CONSTRAINT account_info_nn NOT NULL
);

-- 칼럼 레벨 제약조건

CREATE TABLE 테이블_이름(

칼럼이름 데이터_타입 CONSTRAINT 제약조건_이름 NOT NULL

);

 

이렇게 써도됨, null값이라 입력안됨

UPDATE account_info SET email = NULL WHERE id = 1;

 

 

 

 

 

  • 제약조건확인하기 (테이블별)
SELECT * FROM ALL_CONSTRAINTS WHERE TABLE_NAME = 'ACCOUNT_INFO';

 

 

  • UNIQUE : 중복제한 (null은 들어감)

 

 

  • 명시적으로 걸어주기 unique는 uq라고함
email VARCHAR2(128) CONSTRAINT account_info_uq UNIQUE

 

 

 

 

 

  • 테이블레벨 맨 아래에서 지정 쉽게 인지가능(제약조건 동시에 걸때)
CREATE TABLE account_info (
    id NUMBER PRIMARY KEY,
    email VARCHAR2(128) NOT NULL,
    
    CONSTRAINT account_info_uq UNIQUE(email)
);

 

(형식)

-- 테이블 레벨 제약조건

CREATE TABLE 테이블_이름(

칼럼이름 데이터_타입,

...,

CONSTRAINT 제약조건_이름 PRIMARY KEY (칼럼이름)

 

 

 

  • PRIMARY KEY 는 pk라고 함(unique랑 not null 둘다 포함)
    id NUMBER CONSTRAINT account_info_pk PRIMARY KEY,

 

 

 

 

 

  • account_info의 id값을 참조하고싶을때
CREATE TABLE account_authentication (
    id NUMBER PRIMARY KEY,
    password VARCHAR(128) NOT NULL,
    account_info_id NUMBER REFERENCES account_info(id)
    
);

 

 

 

 

 

  • 참조하는 부모테이블의 값이 없을때
명령의 22 행에서 시작하는 중 오류 발생 -
INSERT INTO account_authentication(id, password, account_info_id)
VALUES (1,'1234', 124)
오류 보고 -
ORA-02291: integrity constraint (TEST01.SYS_C007092) violated - parent key not found

 

 

  • 참조할때 조건쓰기1
CREATE TABLE account_authentication (
    id NUMBER PRIMARY KEY,
    password VARCHAR(128) NOT NULL,
    account_info_id NUMBER CONSTRAINT account_info_fk
    REFERENCES account_info(id)
    
);
  • 2
CREATE TABLE account_authentication (
    id NUMBER PRIMARY KEY,
    password VARCHAR(128) NOT NULL,
    account_info_id NUMBER ,
    CONSTRAINT account_info_fk FOREIGN KEY(account_info_id) REFERENCES account_info(id)
    
);

 

 

 

 

  • ON DELETE CASCADE 참조하고있는 값들도 삭제
CREATE TABLE account_authentication (
    id NUMBER PRIMARY KEY,
    password VARCHAR(128) NOT NULL,
    account_info_id NUMBER REFERENCES account_info(id)
    ON DELETE CASCADE
    
);

 

 

 

  • check 조건식
CREATE TABLE account_authentication (
    id NUMBER PRIMARY KEY,
    password VARCHAR(128) NOT NULL,
    account_info_id NUMBER REFERENCES account_info(id)
    ON DELETE SET NULL,
    CONSTRAINT password_length_chk CHECK (length(password) >3)
    
);

    CONSTRAINT password_length_chk CHECK (length(password) >3)

 

 

 

INSERT INTO account_authentication(id, password,account_info_id) VALUES(1,'1234', 123); 는 되지만 

INSERT INTO account_authentication(id, password,account_info_id) VALUES(1,'123', 123); 은 안됨

제약조건을 걸어놨기 때문

 

 

 

삭제할때는 자식테이블부터 삭제해야 삭제가능

 

 

 

 

 

  • 제약조건 업데이트할때 위반발생 밑에같은 경우 abcd를 abc로 하려고하니까 중복되서 x
CREATE TABLE account_info (
    id NUMBER,
    email VARCHAR2(128) UNIQUE 
);

SELECT * FROM account_info;
INSERT INTO account_info(id, email) VALUES (1, 'abc@gmail.com');
INSERT INTO account_info(id, email) VALUES (2, 'abcd@gmail.com');
UPDATE account_info SET email = 'abc@gmail.com' WHERE id = 2;

 

 

ALTER 

728x90
LIST

'DB > Oracle' 카테고리의 다른 글

20201026_22 문제 및 해결1  (0) 2020.10.26
20201026_22 제약조건  (0) 2020.10.26
20201024_21 Review  (0) 2020.10.23
20201023_21 group by  (0) 2020.10.23
테스트용 scott 스크립트  (0) 2020.10.23

댓글