[Oracle] 2020.12.24. day_44 synonym 생성, 삭제, 권한부여, view(단순,복합 view), with check option(단순 view DML)
2020. 12. 24. 14:09ㆍWeb_Back-end/Oracle
◎ synonym
synonym |
테이블의 별명, 테이블의 이름을 설정해주는 것 alias와 같은 역할을 한다고 이해 |
테이블을 다른 이름으로 호출할 수 있는 객체 |
권한이 설정된 계정만 synonym을 생성할 수 있다 |
관리자계정으로 권한을 확인할 수 있다 |
계정이 달라도 사용할 수 있다 |
다른 유저의 객체(테이블, 뷰, 프로시저, 함수, 패키지, 시퀀스 같은)를 참조할 때 많이 사용 |
다른 유저의 객체를 사용할 때 유저의 이름, 객체의 실제이름을 사용하는데 그 두개를 감춤으로 database 보안을 개선하기 위해 사용된다 |
▼ 시노님 생성문법
생성문법)
create synonym 시노님명 for 테이블명;
▼ 시노님 삭제문법
drop synonym 시노님명;
◎ 권한
권한의 종류 | |
시스템권한 | dba_role_privs (dictionary에서 볼 수 있다) |
connect, resource 권한 | |
쿼리문생성권한 | dba_sys_privs (dictionary에서 볼 수 있다) |
▼ 해당 계정만 사용할 수 있는 시노님생성을 할 권한부여 문법
grant create synonym to 계정명;
▼ 모든 계정이 사용할 수 있는 시노님생성을 할 권한부여 문법
grant create public synonym to 계정명;
※ 시노님 생성해보기
1. 시노님을 생성해본다
--시노님 생성
--cp_emp4 테이블의 시노님을 ce4로 설정
create synonym ce4 for cp_emp4;
2. 실패이유 - 권한없음 : 권한부여 해보기
권한이 없기 때문에 만들어지지 않는다 따라서 권한을 부여해보자
권한부여는 관리자계정에서 해야한다
--권한설정
grant create synonym to scott;
※ 쿼리문 생성권한 확인해보기
select * from dba_sys_privs
where grantee = 'SCOTT';
※ 조회 결과가 똑같이 수행된다
--조회
select * from cp_emp4;
select * from ce4;
◎ view
view | |
실제 테이블을 사용하지 않고 조회를 수행할 때 | |
단순 view, 복합 view를 지원 | |
권한이 부여된 계정만 뷰를 생성할 수 있다 | |
복잡한 쿼리문을 단순화하여 조회할 수 있다, 속도가 빠르다(memory에서 작업하는것이라) | |
실제 테이블에 DML작업이 발생하면 view에 바로 반영된다 | |
생성된 view는 user_views 테이블에서 조회 | |
단순 view | 테이블 하나에서 도출된 뷰 |
함수나 수식을 포함하지 않고 단순한 컬럼으로만 도출된 뷰 | |
DML 수행이 가능 (뷰에 작업한 내용이 실제 도출된 테이블에 반영된다) | |
복합 view | 여러 테이블에서 도출된 뷰 (join, union) |
함수나 수식을 포함하여 도출된 뷰 | |
DML 수행이 안된다 : insert 불가능 join으로 되어있으면 DML 수행 가능 (update, delete) 함수나 수식을 포함한 뷰는 DML 전체 수행 불가 |
◉ view 생성, 삭제
메모리를 쓰기 때문에 쓰지 않을 때도 메모리를 점유하고 있다
--> 아무나 만들 수 없다
--> 권한이 부여되어야 만들 수 있다
▼ view를 만드는 문법 (권한이 들어있어야한다)
create [or replace] view 뷰명(컬럼명,,,) as (select,,,);
◉ 컬럼명 안써도 된다
◉ select 에 join이 들어가면 복합뷰권한이 부여된 계정만 뷰를 만들 수 있기 때문에 권한을 먼저 부여한다
▼ view를 삭제
drop view 뷰명;
※ 단순 view DML : 실제로 존재하는 테이블이 아니지만 수행할 수 있다
view에서 작업하거나 실제테이블에서 작업해도, 둘다 반영된다
※ 단순 view에서 DML이 안될 때, with check option 부여하면 된다
1. view_ insert
insert into v_cp_emp(empno, ename) values(1111, '김ㅇ규');
2. view_ update
update v_cp_emp
set job='사원', mgr=1234
where empno = 1111;
3. view_ delete
delete from v_cp_emp where empno=1111;
※ 복합 view
dept, emp 테이블을 복사한 cp_dept, cp_emp 테이블을 생성하여 사용해보기
create table cp_dept as (select * from dept);
create table cp_emp as (select * from emp);
※ 복합 view는 모든 DML 불가 _ select 만 가능하다
cp_dept , cp_emp 테이블을 조인해서, v_dept 뷰를 생성
create view v_dept as
(select d.deptno, d.dname, d.loc, e.empno, e.ename, e.job, e.hiredate
from dept d, emp e
where e.deptno(+) = d.deptno
);
select * from v_dept;
--view를 사용하면 조인하지 않아도 서로다른 테이블의 레코드를 얻을 수 있다
select deptno, dname, loc, empno, initcap(ename), job, hiredate
from v_dept
where deptno = 10;
※ view 변경
create or replace view v_dept as
(select d.deptno, d.dname, d.loc, e.empno, e.ename
from dept d, emp e
where e.deptno(+) = d.deptno
);