다른 명령
뷰 (VIEW)
뷰 생성
뷰 생성 Bequeath 절
- 12c 부터 신규 적용
- BEQUEATH CURRENT_USER : 해당 뷰를 호출한(사용하는) 계정의 권한으로 뷰를 실행
- BEQUEATH DEFINER : 해당 뷰를 생성한 계정의 권한으로 뷰를 실행
수정 가능 뷰 생성
CREATE EDITIONING VIEW ed_orders_view (o_id, o_date, o_status) AS SELECT order_id, order_date, order_status FROM orders WITH READ ONLY;
- 이 뷰를 사용하면 order 테이블이 DDL 작업으로 변경되더라고 애플리케이션에서는 뷰를 이용하여 독립적으로 사용 할 수 있음.
- 이 뷰에 DML 트리거를 만들면 DML 작업이 뷰 자체를 대상으로 할 때 트리거가 실행되지만 DML 작업이 orders 테이블을 대상으로 할 때는 실행되지 않음.
CREATE VIEW clerk AS SELECT employee_id, last_name, department_id, job_id FROM employees WHERE job_id = 'PU_CLERK' or job_id = 'SH_CLERK' or job_id = 'ST_CLERK'; -- 수정시 UPDATE clerk SET job_id = 'PU_MAN' WHERE employee_id = 118;
- job_id = 'PU_MAN' 인경우에도 수정 가능
특정 조건만 수정할수 있는 뷰 생성
CREATE VIEW clerk AS SELECT employee_id, last_name, department_id, job_id FROM employees WHERE job_id = 'PU_CLERK' or job_id = 'SH_CLERK' or job_id = 'ST_CLERK' WITH CHECK OPTION;
- job_id = 'PU_MAN' 인경우 수정 불가능
읽기 전용 뷰 생성
CREATE VIEW customer_ro (name, language, credit) AS SELECT cust_last_name, nls_language, credit_limit FROM customers WITH READ ONLY;
뷰 (VIEW) 구성 컬럼 정보조회
select col.owner as schema_name, col.table_name, '' logi_name, col.column_id, col.column_name, '' column_attr, col.data_type, col.data_length data_conv_length, col.data_length, col.data_precision, col.data_scale, col.nullable from sys.all_tab_columns col inner join sys.all_views v on col.owner = v.owner and col.table_name = v.view_name where col.owner = 'SCOTT' order by col.owner, col.table_name, col.column_id;
VIEW 정의내역 정보 조회
SET LONG 100000 SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME LIKE UPPER('&뷰_이름');
뷰(VIEW) 권한
뷰안에 포함된 다른 사용자의 테이블/뷰에 대한 권한 부여 방법
1) A사용자.뷰를 B사용자에게 줄때 권한 에러 발생시
A사용자.뷰안에 포함된 A사용자가 소유한 오브젝트를 제외한 타유저의 오브젝트에 권한을 상속받아서 권한가 발생하지 않음.
예시 ) SCOTT유저가 LEE 유저에게 뷰 조회 권한을 주고자한다.
SCOTT유저가 만든 V1은 KIM유저의 V0(뷰/테이블) 이 조인되어 있다.
1) SCOTT자신이 만든 뷰(A.V1) 안에 다른 유저의 뷰를 사용 할경우
CREATE VIEW V1 AS SELECT A.xxx , V0.컬럼 FROM EMP A , KIMCHI.V0 WHERE A.EMP_NO = B.EMP_NO ;
2) 다른유저에게 뷰1 조회 권한을 줄때 권한 에러 발생시
GRANT SELECT ON KIM.V0 TO SCOTT '''WITH GRANT OPTION''';
V0에 with grant option을 줘야함.
뷰0 내부의 다른유저테이블에도 WITH GRANT OPTION 필요함.