행위

"ORACLE 뷰"의 두 판 사이의 차이

DB CAFE

()
(수정 가능 뷰 생성)
 
(같은 사용자의 중간 판 7개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
== 뷰 (VIEW) ==
 
== 뷰 (VIEW) ==
 +
=== 뷰 생성 ===
  
== 뷰 구성 컬럼 정보 ==
+
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/img/create_view.gif
 +
 
 +
==== 뷰 생성 Bequeath 절 ====
 +
* 12c 부터 신규 적용
 +
* BEQUEATH CURRENT_USER : 해당 뷰를 호출한(사용하는) 계정의 권한으로 뷰를 실행
 +
* BEQUEATH DEFINER : 해당 뷰를 생성한 계정의 권한으로 뷰를 실행
 +
 
 +
==== 수정 가능 생성 ====
 +
<source lang=sql>
 +
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;
 +
</source>
 +
* 이 뷰를 사용하면 order 테이블이 DDL 작업으로 변경되더라고 애플리케이션에서는 뷰를 이용하여 독립적으로 사용 할 수 있음.
 +
* 이 뷰에 DML 트리거를 만들면 DML 작업이 뷰 자체를 대상으로 할 때 트리거가 실행되지만 DML 작업이 orders 테이블을 대상으로 할 때는 실행되지 않음.
 +
 
 +
<source lang=sql>
 +
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;
 +
 
 +
</source>
 +
* job_id = 'PU_MAN' 인경우에도 수정 가능
 +
 
 +
==== 특정 조건만 수정할수 있는 뷰 생성 ====
 +
<source lang=sql>
 +
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;
 +
</source>
 +
* job_id = 'PU_MAN' 인경우 수정 불가능
 +
 
 +
==== 읽기 전용 뷰 생성 ====
 +
<source lang=sql>
 +
CREATE VIEW customer_ro (name, language, credit)
 +
    AS
 +
SELECT cust_last_name, nls_language, credit_limit
 +
  FROM customers
 +
 
 +
  WITH READ ONLY;
 +
 
 +
</source>
 +
 
 +
=== 뷰 (VIEW) 구성 컬럼 정보조회 ===
 
<source lang="sql">  
 
<source lang="sql">  
 
select col.owner as schema_name,
 
select col.owner as schema_name,
22번째 줄: 77번째 줄:
 
</source>
 
</source>
  
==== VIEW 정의내역 정보 ====
+
=== VIEW 정의내역 정보 조회 ===
 
<source lang="sql">  
 
<source lang="sql">  
 
SET LONG 100000
 
SET LONG 100000
32번째 줄: 87번째 줄:
 
  </source>
 
  </source>
  
==== [[오라클 VIEW 권한|뷰(VIEW) 권한]] ====
+
=== 뷰(VIEW) 권한 ===
  
 
{{:오라클 VIEW 권한|뷰(VIEW) 권한}}
 
{{:오라클 VIEW 권한|뷰(VIEW) 권한}}
  
 
[[Category:oracle]]
 
[[Category:oracle]]

2024년 8월 6일 (화) 12:38 기준 최신판

thumb_up 추천메뉴 바로가기


1 뷰 (VIEW)[편집]

1.1 뷰 생성[편집]

create_view.gif

1.1.1 뷰 생성 Bequeath 절[편집]

  • 12c 부터 신규 적용
  • BEQUEATH CURRENT_USER : 해당 뷰를 호출한(사용하는) 계정의 권한으로 뷰를 실행
  • BEQUEATH DEFINER : 해당 뷰를 생성한 계정의 권한으로 뷰를 실행

1.1.2 수정 가능 뷰 생성[편집]

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' 인경우에도 수정 가능

1.1.3 특정 조건만 수정할수 있는 뷰 생성[편집]

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' 인경우 수정 불가능

1.1.4 읽기 전용 뷰 생성[편집]

CREATE VIEW customer_ro (name, language, credit)
    AS 
SELECT cust_last_name, nls_language, credit_limit
  FROM customers
  
  WITH READ ONLY;

1.2 뷰 (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;

1.3 VIEW 정의내역 정보 조회[편집]

SET LONG 100000

SELECT TEXT 
  FROM USER_VIEWS 
 WHERE VIEW_NAME 
 LIKE UPPER('&뷰_이름');

1.4 뷰(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 필요함.