그래요 또 평가예요. 이제 별로 놀랍거나 두렵지도 않음..
사실 정리해서 올리고 싶지 않은데 그러면 시리즈에 순서가 안 맞아서
굉장히 불편하기 때문에...오늘도 정리를 한다.
DCL은 데이터에 대한 접근 권한을 부여, 회수하는 명령어들을 의미한다.
그 안에는 grant, revoke가 있으며, grant는 권한을 부여 / revoke는 권한을 회수한다.
그리고 이때 부여하는 권한 묶음들을 role이라고 말하며, 주로 사용하는 role은 자원을 관리하고 조작하는 묶음인 resource와 연결 세션을 만드는 묶음인 connect가 있다.
[ 사용법 ]
grant 접근 권한 to 계정명;
revoke 접근 권한 from 계정명;
Set Operator도 join처럼 두 개 이상의 테이블을 연결하는 기능이지만 그 원리는 다르다.
이 중 minus의 사용법은 다음과 같다.
[ 사용법 ]
select * from tmp1; -- ABC
MINUS
select * from tmp2; -- BCD
-- 출력 : A
이처럼, MINUS는 두 테이블의 출력 결과를 비교하여, 앞쪽 결과에서 뒤쪽 결과의 중복값을 제거한 뒤
앞쪽 결과만 반환한다.
먼저 트랜잭션이란 데이터베이스에 실제 반영될 작업들의 최소 단위를 의미한다.
우리가 쿼리를 통해 특정 작업을 명령하면, 트랜잭션을 거쳐 그 작업의 결과가 데이터베이스에 반영된다.
rollback to (포인트 이름);
위처럼 사용하면 저장해놓은 시점으로 이동하는데 한 가지 주의할 점은 돌아온 과거보다 미래로는 이동할 수 없으며, 커밋과 동시에 savepoint
는 사라진다.
테이블 정의서에 따라 테이블을 생성하고, 요구사항을 충족할 수 있도록 시퀀스를 생성하는 SQL작성 후 정상 결과와 같은 같은 형태로 데이터를 조회하기 위하여, 데이터 삽입, 조회를 수행하였으나 정상처리되지 않는 문제가 발생하였다.
SQL구문을 분석하여 요구사항을 충족시키지 못하거나, 정상 결과가 조회되지 않은 원인과, 정상 결과가 조회될 수 있도록 하는 조치내용을 순서대로 작성하시오.
[ 작성한 SQL문 ]
-- BRANDS 테이블 생성
CREATE TABLE BRANDS(
BRAND_ID NUMBER PRIMARY KEY,
BRAND_NAME VARCHAR2(100) NOT NULL
);
-- PRODUCTS 테이블 생성
CREATE TABLE PRODUCTS(
PRODUCT_NO NUMBER PRIMARY KEY,
PRODUCT_NAME VARCHAR2(50) NOT NULL,
PRODUCT_PRICE NUMBER NOT NULL,
BRAND_CODE NUMBER REFERENCES BRANDS,
SERIAL_NO VARCHAR2(100),
SOLD_OUT CHAR(1) DEFAULT 'N' CHECK(SOLD_OUT IN ('Y', 'N'))
);
-- SEQ_BRAND_ID 시퀀스 생성
CREATE SEQUENCE SEQ_BRAND_ID
START WITH 100
INCREMENT BY 100
MAXVALUE 500
NOCYCLE;
-- SEQ_PRODUCT_NO 시퀀스 생성
CREATE SEQUENCE SEQ_PRODUCT_NO
START WITH 1
INCREMENT BY 1
MAXVALUE 10000
NOCYCLE;
-- BRANDS 테이블 데이터 삽입
INSERT INTO BRANDS VALUES (SEQ_BRAND_ID.NEXTVAL, '삼성');
INSERT INTO BRANDS VALUES (SEQ_BRAND_ID.CURRVAL, '애플');
-- PRODUCTS 테이블 데이터 삽입
INSERT INTO PRODUCTS VALUES (SEQ_PRODUCT_NO.NEXTVAL, '갤럭시S8', 800000, 100, 'S8','Y');
INSERT INTO PRODUCTS VALUES (SEQ_PRODUCT_NO.NEXTVAL, '갤럭시S9', 900000, 100, 'S9','N');
INSERT INTO PRODUCTS VALUES (SEQ_PRODUCT_NO.NEXTVAL, '갤럭시S10', 1000000, 100, 'S10','N');
INSERT INTO PRODUCTS VALUES (SEQ_PRODUCT_NO.NEXTVAL, '아이폰9S', 900000, 200, '9S','N');
INSERT INTO PRODUCTS VALUES (SEQ_PRODUCT_NO.NEXTVAL, '아이폰10S', 1000000, 200, '10S','N');
-- 결과 조회
SELECT PRODUCT_NAME, PRODUCT_PRICE, BRAND_NAME, SOLD_OUT
FROM PRODUCTS JOIN BRANDS ON (BRAND_ID = BRAND_CODE);
INSERT INTO BRANDS VALUES (SEQ_BRAND_ID.CURRVAL, '애플')
.currva
l 은 현재 시퀀스의 값을 한번 더 불러오는 기능이다. 따라서 시퀀스값이 오르지 않은 현재 값이 입력된다. 이때, brand_id
의 제약조건은 primary key로 기본 공백과 중복입력이제한되어 있다.
그러므로, 첫째, 메서드가 잘못 호출하였고 동시에 제약조건에 걸려 에러가 발생한다.
전반적으로 주키 설정과, 외래키 설정을 하려기에 drop으로 삭제 후 다시 재생성 해주고자 한다.
drop table brands;
drop table products;
drop SEQUENCE SEQ_PRODUCT_NO;
drop SEQUENCE SEQ_BRAND_ID;
-- 1. PRODUCT_NAME VARCHAR2(50) NOT NULL / SERIAL_NO VARCHAR2(100)
PRODUCT_NAME VARCHAR2(20) NOT NULL
SERIAL_NO VARCHAR2(100) unique,
-------------------------------------
CREATE TABLE PRODUCTS(
PRODUCT_NO NUMBER PRIMARY KEY,
PRODUCT_NAME VARCHAR2(20) NOT NULL,
PRODUCT_PRICE NUMBER NOT NULL,
BRAND_CODE NUMBER REFERENCES BRANDS,
SERIAL_NO VARCHAR2(100) UNIQUE,
SOLD_OUT CHAR(1) DEFAULT 'N' CHECK(SOLD_OUT IN ('Y', 'N'))
);
-- 2. MAXVALUE 1000
CREATE SEQUENCE SEQ_BRAND_ID
START WITH 100
INCREMENT BY 100
MAXVALUE 1000
NOCYCLE;
-- 3. 시퀀스 메서드 변경
INSERT INTO BRANDS VALUES (SEQ_BRAND_ID.NEXTVAL, '애플');