DCL(data control language)
사용자에 대한 권한설정 내용. 즉, 사용자계정에 권한을 부여 회수하는 명령어
- 권한: select, insert, update, delete, create
- ROLE: 다수의 권한을 특정 이름으로 묶어서 표현한 것. 즉, role에 따라 권한이 달라짐
1. 권한
관리자 계정
관리자 계정은 어디든 다 접근할 수 있음
타 계정 데이터 가져오기도 가능(해당하는 계정의 접속 여부와 무관)
grant:: 권한/롤 부여하는 명령어
GRANT 권한명/ROLE명, ... TO 사용자계정명
grant connect, resource to qwer; -> 2개 권한 부여
- 특정 테이블에 권한/롤 주기
- GRANT 권한명 on 테이블 to 사용자계정명
-- 관리자계정에서 권한 부여
grant select on bs.employee to qwer;
grant select on bs.temp_dept to qwer;
--> select 권한은 조회밖에 못하는 권한이다.
REVOKE :: 권한/롤 회수하기
REVOKE 권한명/ROLE명 FROM 사용자계정명
- 특정 테이블에 권한 회수
- REVOKE 권한명 on 테이블 FROM 사용자계정명
revoke insert on bs.temp_dept from qwer;
role 생성
나만의 역할을 생성할 수 있다.
: create role 역할명
-- role 생성하기
create role MYROLE;
GRANT CREATE TABLE, CREATE VIEW TO MYROLE;
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'MYROLE'; -- 잘 저장되었는지 확인
-- 이제 해당 역할을 부여하면 2개 권한이 부여된다.
role의 권한 확인하기
oracle이 제공하는 DBA_SYS_PRIVS 테이블에서 확인
- 조건문으로 GRANTEE = '확인할 role' 추가해주면 해당 역할에 대한 권한 조회가 가능하다.
select * from DBA_SYS_PRIVS where GRANTEE = 'RESOURCE';
select * from DBA_SYS_PRIVS where GRANTEE = 'CONNECT';
---- connect, resource -> role에 해당
반응형
2. TCL :: 트랜잭션을 제어하는 명령어
트랜잭션 = 하나의 작업단위(서비스) → TCL = 서비스를 제어하는 명령어
- 서비스 = 데이터 수정 → 여러개의 insert, update, delete 명령어가 트랜잭션 단위에 포함된다.
- 트랜잭션은 세션당 생성이 되고 이전 커밋 이후부터 새로운 커밋을 실행하기 전까지가 하나의 트랜잭션이다.
은행 서비스로 보았을 때 이체가 되는 즉시 상대방의 계좌에 입금처리가 되어야 것이 하나의 트랜잭션이다.
(입금되기까지 다양한 테이블에 여러 insert가 필요하다고 했을 때, 이 과정이 오류없이 모두 잘 수행되었으면 저장이 되고(커밋), 그렇지 않으면 다시 롤백되어서 취소된다. (이때, 수행되지않은 일부 insert만 롤백할 수도 있다.)
insert into bs.temp_dept values ('D9', 'TRAN', '90');
delete from bs.temp_dept where dept_id = 'D1';
select * from bs.temp_dept;
-- 해당 계정에서는 데이터가 보이지만, 커밋되지 않았기 때문에 다른 세션에서는 안보인다.(터미널에서 검색)
commit;
COMMIT과 ROLLBACK
commin : 저장
rollback : 실행취소
- java에서 db에 접속하여 작업을 수행할 때 트랜잭션 처리를 한다.
예시 코드를 살펴보자
//회원등록(회원테이블)시 가족이 있으면 추가로 등록(가족테이블)하는 경우
public int insertMember(MemberDTO m) {
Connection conn = getConnection();
int result = dao.insertMember(conn, m);
//가족 입력한경우 조건 추가, 트랜잭션 처리
if(result > 0 && m.getFamily() != null && m.getFamily().size() > 0) {
m.getFamily().forEach(f -> {
f.setMemberId(m.getMemberId());
int result1 = dao.insertFamily(conn, f);
if(result1 == 0) { //가족 데이터 저장이 정상적으로 처리되지 않았다면 회원 데이터도 저장 안함
rollback(conn);
throw new RuntimeException("저장실패");
//만약, 여기서 return을 하면 처음 result값인 1이 최종 값이 되면서 처리 성공으로 출력됨
}
// dao.insertFamily(conn, f, m.getMemberId());
});
} else { //회원등록에서 바로 에러가 나면 int가 0이 됨. 그럼 커밋되지 않고 rollback되어 저장되지 않을 것.
rollback(conn);
}
// if(result >0) commit(conn);
// else rollback(conn);
close(conn); //닫히면서 자동으로 커밋됨
return result;
}
반응형
'Oracle DataBase' 카테고리의 다른 글
11. ORACLE :: PL/SQL, PROCEDURE, FUNCTION,TRIGGER, CURSOR 정리 (6) | 2024.06.13 |
---|---|
10. ORACLE :: oracle 내 객체 활용 정리(object) (0) | 2024.06.12 |
8. ORACLE :: DML구문(insert, upadate, delete) 정리 (0) | 2024.06.12 |
7. ORACLE 정리 :: DDL구문(create, alter, drop) (2) | 2024.06.11 |
6. ORACLE 정리 :: 서브쿼리(SUBQUERY) - 단일행, 다중행, 다중열, 상관, 스칼라 (2) | 2024.06.04 |