DBMS에 대한 설정(제어)에 관한 구문
DB시스템 작업에 대한 권한 👉🏻 DDL권한들
✔ 대표적인 시스템 권한
CREATE SESSION: DB에 대한 접속(접근) 권한
CREATE TABLE: 테이블 생성 권한
UNLIMITED TABLESPACE: 모든 테이블 스페이스 이용권한
- 모든 유저의 테이블에 대한 권한이 부여됨
CREATE ANY TABLE
ALTER ANY TABLE
DROP ANY TABLE
SELECT ANY TABLE
UPDATE ANY TABLE
DELETE ANY TABLE
SYSDBA: 데이터베이스 관리 최고권한 👉🏻 뭐든지 다 가능
➡ GRANT로 부여하는 일이 거의 없으며conn sys as sysdba정도로 사용
WITH ADMIN OPTION : 부여받은 시스템 권한을 다른 사용자계정에 부여할 수 있도록 함user_sys_privs : 일반 사용자 계정으로 부여한 시스템 권한dba_sys_privs : 관리자 계정으로 부여한 시스템 권한-- privs_test/1234 사용자 계정 생성
CREATE USER privs_user IDENTIFIED BY 1234; --에러, 권한 불충분
-- [system 계정 이용]
-- scott계정에게 CREATE USER 시스템 권한 부여
GRANT
CREATE USER
TO scott;
-- scott계정에게 CREATE SESSION 시스템 권한을 ADMIN OPTION으로 부여
GRANT
CREATE SESSION
TO scott
WITH ADMIN OPTION;
-- [scott 계정 이용]
-- privs_user에 CREATE SESSION 권한 부여
GRANT
CREATE SESSION
TO privs_user;
-- [system 계정 이용]
-- scott에게 부여한 CREATE SESSION 회수하기
REVOKE
CREATE SESSION
FROM scott;
-- 자료사전 확인
SELECT * FROM dba_sys_privs
WHERE grantee = upper('scott'); --관리자 계정으로 scott에게 부여된 권한 확인
SELECT * FROM user_sys_privs; --사용자 계정으로 본인의 권한 확인
권한들을 모아놓는 객체 / 권한 집합
user_role_privs : 일반 사용자 계정의 부여받은 롤dba_role_privs : 관리자 계정으로 부여한 롤-- 롤 자료사전 조회
SELECT * FROM user_role_privs; --CONNECT, RESOURCE 두 롤을 부여받고 있음
-- [system 계정 이용]
SELECT * FROM dba_sys_privs
--WHERE grantee = upper('scott'); --SCOTT의 부여받은 롤 확인
WHERE grantee IN ('CONNECT', 'RESOURCE'); --롤 확인
-- 롤을 포함하여 사용자의 모든 권한을 조회하는 구문
SELECT * FROM dba_sys_privs
WHERE grantee = 'SCOTT' --SCOTT에게 직접 부여된 권한
UNION
SELECT * FROM dba_sys_privs
WHERE grantee IN (
SELECT granted_role FROM dba_role_privs --특정 사용자에게 부여된 롤
WHERE grantee = 'SCOTT'
)
ORDER BY 1,2;
-- 기본 롤 부여
GRANT CONNECT, RESOURCE
TO privs_user;
-- 롤 권한 회수
REVOKE CONNECT, RESOURCE
FROM privs_user;
db객체에 작업(CRUD)을 수행할 수 있는 권한
user_tab_privs : 일반 사용자 계정의 테이블 객체권한dba_tab_privs : 관리자 계정의 테이블 객체권한✔ 대표적인 시스템 권한
SELECT
INSERT
UPDATE
DELETE
ALTER: 객체 스키마 변경 권한
RENAME: 객체 이름 변경 권한
COMMENT: 객체에 코멘트를 작성할 수 있는 권한
-- [system 계정 이용]
REVOKE SELECT ANY TABLE
FROM privs_user;
-- [scott 계정 이용]
GRANT SELECT
ON dept
TO privs_user;
GRANT SELECT, INSERT
ON emp
TO privs_user;
REVOKE INSERT
ON emp
FROM privs_user;
오라클 기본 SQL에 절차적 언어 특성을 확장(추가)한 문법 👉🏻 SQL에 프로그래밍 처리가 추가된 형식
❗ 구문의 출력 결과를 모니터에 보이도록 설정 : SET SERVEROUTPUT ON;
👉🏻 SQL Developer를 껐다 켤 때마다 실행해야 함
BEGIN, END ➡ 필수요소DECLARE, EXCEPTION ➡ 선택요소; : 문장 하나의 끝/ : 하나의 PL/SQL 구문이 완료되었음을 나타냄 👉🏻 /는 단독으로 사용!:= : 값 대입DBMS_OUTPUT.PUT() : 모니터에 데이터를 출력 / 개행, FLUSH 안함DBMS_OUTPUT.NEW_LINE() : 출력된 데이터를 FLUSH하고 개행함DBMS_OUTPUT.PUT_LINE() : PUT() + NEW_LINE() 두 함수를 합친 동작DECLARE
num1 NUMBER;
num2 NUMBER := 10;
BEGIN
DBMS_OUTPUT.PUT_LINE('num1 = ' || num1);
DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);
--값대입
num1 := 555;
num2 := 666;
DBMS_OUTPUT.PUT_LINE('num1 = ' || num1);
DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);
END;
/
-- SELECT 구문을 조회한 결과를 변수에 저장하기 / 변수의 데이터타입을 테이블 정보로 지정하기
DECLARE
v_dname dept.dname%TYPE := upper('&input'); --키보드 입력받아 설정하기
--deptno을 저장할 변수 선언
v_deptno dept.deptno%TYPE;
BEGIN
SELECT deptno
INTO v_deptno
FROM dept
WHERE dname = v_dname;
DBMS_OUTPUT.PUT_LINE(v_dname || '팀의 부서번호 : ' || v_deptno);
END;
/
DECLARE
v_num NUMBER := #
BEGIN
IF v_num > 0 THEN
DBMS_OUTPUT.PUT_LINE('양수입니다.');
ELSIF v_num < 0 THEN
DBMS_OUTPUT.PUT_LINE('음수입니다.');
ELSE
DBMS_OUTPUT.PUT_LINE('0입니다.');
END IF;
END;
/
BEGIN
-- 무한반복되다가 버퍼 메모리 부족으로 강제 중단됨
LOOP
DBMS_OUTPUT.PUT_LINE('HI');
END LOOP;
END;
/
REVERSE 키워드를 추가하면 종료값부터 시작값까지(역순으로) 진행됨END LOOP;이후에 사용할 수 없음BEGIN
FOR i IN 1..10
LOOP
-- i변수 이용
i := i * 10;
DBMS_OUTPUT.PUT(i || ' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE();
-- FOR에서 사용된 인덱스는 END LOOP; 이우에 사용할 수 없음
-- DBMS_OUTPUT.NEW_LINE(i);
END;
/
-- REVERSE FOR LOOP 반복문
BEGIN
-- 반복구간을 역순으로 지정하면 FOR LOOP가 반복되지 않음
-- FOR i IN 10..1
FOR i IN REVERSE 1..10
LOOP
DBMS_OUTPUT.PUT(i || ' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE();
END;
/
BEGIN
FOR dept_row IN (
SELECT * FROM dept
ORDER BY deptno DESC
)
LOOP
-- 에러, 조회결과 변수를 바로 사용할 수 없음 -> dept_row에 행의 모든 데이터가 들어가있으므로 각 컬럼에 맞게 하나씩 꺼내줘야 함
-- DBMS_OUTPUT.PUT_LINE(dept_row);
DBMS_OUTPUT.PUT(dept_row.deptno);
DBMS_OUTPUT.PUT(chr(9));
DBMS_OUTPUT.PUT(dept_row.dname);
DBMS_OUTPUT.PUT(chr(9));
DBMS_OUTPUT.PUT_LINE(dept_row.loc);
END LOOP;
END;
/
DECLARE
i NUMBER := 0; --초기식
BEGIN
WHILE i<5 --조건식
LOOP
i := i + 1; --증감식
DBMS_OUTPUT.PUT(i || ' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE();
END;
/
-- 무한반복 LOOP + EXIT구문
DECLARE
i BINARY_INTEGER := 0; --BINARY_INTEGER : PL/SQL 전용 INT
BEGIN
LOOP
EXIT WHEN i >= 10; --조건식
-- 수행코드
DBMS_OUTPUT.PUT('HI' || ' ');
i := i + 1; --증감식
END LOOP;
DBMS_OUTPUT.NEW_LINE();
END;
/