일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- SQLD 내용
- SQLD SQL 최적화 기본 원리
- 자바 DP 예제
- 백준 1141
- SQLD 책
- 백준 2293 자바
- 백준 접두사 로직
- 오라클 예제
- 백준 1141 로직
- 너비우선탐색
- 백준 예산 자바
- SQLD 요약
- SQLD SQL 활용
- 자바 문자열 예제
- BFS
- 백준
- 백준 예산 코드
- SQLD 내용 정리
- 자바 이분 탐색 예제
- 백준 1141 접두사
- 백준 2293 동전 1
- SQL 기본 및 활용
- 백준 접두사 자바
- 백준 동전1 자바
- 백준 2512 자바
- SQLD 정리
- 백준 부분합 로직
- 자바 예제
- 알고리즘
- SQLD
- Today
- Total
혼자 공부하는 공간
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #7 본문
<목차>
<< DCL (Data Control Language) >>
* 유저를 생성하고 권한을 제어할 수 있는 명령어.
1. 유저와 권한
[문제]
다른 부서 간에 또는 다른 회사 간 데이터를 공유하기 위해 DB를 오픈해야 하는 경우가 있는데 데이터 손실 우려가 커지기 때문에 문제가 된다.
[해결]
새로운 유저를 생성하고, 생성한 유저에 공유할 테이블이나 기타 오브젝트에 대한 접근 권한만 부여한다면 데이터가 수정되거나 손실될 문제를 방지할 수 있다.
* Oracle 설치시 기본적으로 제공되는 유저인 SYS, SYSTEM, SCOTT 유저에 대해 알아본다.
[Oracle VS SQL Server]
1. Oracle
a. 접속 방식
- 유저를 통해 DB에 접속하는 형태
- ID 및 PW 방식으로 'INSTANCE' 에 접속하고, 그에 해당하는 스키마에 오브젝트 생성 등의 권한을 부여 받는다.
2. SQL Server
a. 접속 방식
-
인스턴스에 접속하기 위해 'LOGIN' 을 생성하며, 인스턴스 내에 존재하는 다수의 DB에 연결하여 작업하기 위해 유저를 생성한 후 'LOGIN' 과 'USER' 를 매핑해야 한다.
-
유저는 특정 DB 내의 특정 스키마에 대한 권한을 부여 받는다.
-
두 가지 방식의 로그인
---> Windows 인증 방식
---> 혼합 모드 방식
2-1. Windows 인증 방식
-
Windows에 로그인한 정보를 가지고 SQL Server에 접속하는 방식
-
SQL Server 가 Windows에 제공하는 자격 증명을 신뢰하기 때문에 Windows 인증을 사용한 연결을 트러스트된 연결이라고 한다.
2-2. 혼합 모드 방식 (Windows인증 또는 SQL 인증)
-
Windows 인증으로도 SQL Server에 접속 가능하며, Oracle 인증과 같은 방식으로 사용자 ID 및 PW로 SQL Server에 접속하는 방식.
1-1. 유저 생성과 시스템 권한 부여
* 유저를 생성하고 DB에 접속했다고 해서 테이블, 뷰, 인덱스 등과 같은 오브젝트를 생성할 수는 없다.
* 사용자가 실행하는 모든 DDL 문장(CREATE, ALTER, DROP, RENAME 등)은 그에 해당하는 권한이 있어야만 실행할 수 있다.
* 권한 = 시스템 권한
* 시스템 권한을 일일이 사용자에게 설정하기엔 너무 복잡하므로 ROLE을 이용하여 간편하고 쉽게 권한을 부여할 수 있다.
* 예시 : PJS유저 (패스워드 : KOREA7)를 생성해보자.
1
2
|
CREATE USER PJS IDENTIFIED BY KOREA7;
/* 1행에 오류: ERROR: 권한이 불충분하다 */
|
cs |
---> 현재 유저(SCOTT)는 유저를 생성할 권한을 부여받지 못했기 때문에 권한 에러가 발생했다.
---> Oracle의 DBA 권한을 가진 SYSTEM 유저로 접속하면 유저 생성 권한을 다른 유저에게 부여할 수 있다.
* 예시 : 현재 유저(SCOTT)에게 유저 생성 권한을 부여해보자.
1
2
3
|
GRANT CREATE USER TO SCOTT;
CREATE USER PJS IDENTIFIED BY KOREA7;
/* 사용자가 생성되었다. */
|
cs |
---> 바로 로그인하면 CREATE SESSION 권한이 없어 로그인이 거절된다.
* 예시 : 생성된 PJS 유저가 로그인할 수 있도록 CREATE SESSION 권한을 부여한다.
1
2
|
GRANT CREATE SESSION TO PJS;
/* 권한이 부여되었다. */
|
cs |
---> 생성된 PJS 유저로 로그인하여 테이블을 생성한다.
---> 아직은 로그인 권한만 부여받았기 때문에 테이블 생성 권한이 없어 테이블 생성이 불가능하다.
* 예시 : 생성된 PJS 유저가 테이블을 생성할 수 있도록 CREATE TABLE 권한을 부여한다.
1
2
3
4
5
6
7
|
GRANT CREATE TABLE TO PJS;
/* 권한이 부여되었다. */
/* PJS유저로 연결 */
CREATE TABLE MENU ( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10) );
/* 테이블이 생성되었다. */
|
cs |
1-2. OBJECT에 대한 권한 부여
* 특정 유저가 소유한 객체 권한에 대해 알아보자. 오브젝트 권한은 특정 오브젝트인 테이블, 뷰 등에 대한 SELECT, INSERT, DELETE, UPDATE 작업 명령어를 의미한다.
* 1-1의 예시에서 PJS 유저를 통해 MENU 테이블을 생성하였다. 이 MENU 테이블에 SCOTT 유저로 조회하면 어떻게 될까?
* [Oracle] 다른 유저가 소유한 객체(MENU)에 접근하기 위해서는 객체 앞에 객체를 가진 유저의 이름을 붙여서 접근해야 한다. (PJS.MENU)
* [SQL Server] 다른 유저가 소유한 객체에 접근하기 위해서는 객체 앞에 객체가 속한 스키마의 이름을 붙여서 접근해야 한다. (dbo.MENU)
* 예시 : PJS의 MENU 테이블 조회
1
2
|
SELECT * FROM PJS.MENU;
/* ERROR: 테이블 또는 뷰가 존재하지 않는다. */
|
cs |
---> SCOTT 유저는 PJS 유저에게 MENU 테이블을 SELECT 할 수 있는 권한을 받지 않았기 때문에 MENU 테이블을 조회할 수 없다. PJS 유저에게 적절한 권한을 부여받아야 한다.
* 예시 : PJS로 접속해서 SCOTT 유저에게 MENU 테이블 조회 권한을 부여한다.
1
2
3
4
5
6
7
8
|
INSERT INTO MENU VALUES (1, '화이팅');
/* 1개의 행이 만들어졌다. */
COMMIT;
/* 커밋이 완료되었다. */
GRANT SELECT ON MENU TO SCOTT;
/* 권한이 부여되었다. */
|
cs |
---> PJS 유저가 MENU 테이블에 데이터 하나를 추가한 후 DB에 반영하고 SCOTT에게 MENU 테이블에 대한 SELECT 권한을 부여했다.
---> SCOTT은 PJS.MENU 테이블을 조회할 수 있다. 하지만 UPDATE, INSERT, DELETE의 권한은 받지 않았기 때문에 불가능하다.
2. ROLE을 이용한 권한 부여
* 위의 예시로 확인해 보았듯이 유저를 생성하면 기본적으로 CREATE SESSION, CREATE TABLE, CREATE PROCEDURE 등 많은 권한을 직접 부여해야만 한다.
* DB 관리자는 각 유저별로 어떤 권한이 부여되었는지를 관리해야 하지만 유저가 점점 늘어나고 자주 변경되는 상황에서는 매우 번거로운 작업이 된다.
---> 이 문제를 해결하기 위해 유저와 권한 사이에서 중개 역할을 하는 ROLE을 사용한다.
* DB 관리자는 ROLE을 생성하고, ROLE에 각종 권한들을 부여한 후 ROLE을 다른 ROLE이나 유저에게 부여할 수 있다.
* ROLE에는 시스템 권한/오브젝트 권한을 모두 부여할 수 있고, 유저에게 직접 부여될 수도 있고, 다른 ROLE에 포함되어 유저에게 부여될 수도 있다.
* ROLE을 통한 권한 부여와 권한을 직접 부여하는 경우의 차이를 그림으로 확인해보자.
* 예시 : JISUNG 유저에게 CREATE SESSION과 CREATE TABLE 권한을 가진 ROLE을 생성한 후 ROLE을 이용하여 권한을 JISUNG 유저에게 다시 할당한다. (권한을 취소할 때는 REVOKE를 사용한다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
CONN SYSTEM/MANAGER
/* SYSTEM 유저에 연결. */
REVOKE CREATE SESSION, CREATE TABLE FROM JISUNG;
/*
JISUNG 유저가 가진 CREATE SESSION, CREATE TABLE 권한 취소.
REVOKE [권한] FROM [USER_NAME];
*/
CONN JISUNG/KOREA7
/* ERROR: 사용자 JISUNG은 CREATE SESSION 권한을 가지고 있지 않음. 로그온이 거절되었다. */
/* CREATE SESSION 권한도 취소했으므로 로그인 거절됨. */
CONN SYSTEM/MANAGER
/* SYSTEM 유저에 연결. */
CREATE ROLE LOGIN_TABLE;
/* 롤이 생성되었다. */
/*
CREATE ROLE [ROLE_NAME];
*/
GRANT CREATE SESSION, CREATE TABLE TO LOGIN_TABLE;
/* 권한이 부여되었다. */
/*
GRANT [권한1], [권한2], TO [ROLE_NAME];
*/
GRANT LOGIN_TABLE TO JISUNG;
/* 권한이 부여되었다. */
/*
GRANT [ROLE_NAME] TO [USER_NAME];
*/
CONN JISUNG/KOREA7
/* JISUNG 유저에 연결. */
CREATE TABLE MENU2( MENU_SEQ NUMBER NOT NULL, TITLE VARCHAR2(10));
/* 테이블이 생성되었다. */
|
cs |
---> 예시와 같이 ROLE을 만들어 사용하는 것이 권한을 직접 부여하는 것보다 빠르고 안전하게 유저를 관리하는 방법.
---> Oracle에서는 기본적으로 몇 가지 ROLE을 제공한다. 그 중 가장 많이 사용하는 ROLE은 CONNECT와 RESOURCE.
* 유저를 삭제하는 명령어는 DROP USER.
* 삭제 명령에 CASCADE 옵션을 추가하면 해당 유저가 생성한 오브젝트를 먼저 삭제한 뒤에 유저를 삭제한다.
ex. DROP USER [USER_NAME] CASCADE;
출처
'자격증 > SQLD' 카테고리의 다른 글
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 최적화 기본 원리 #1 (0) | 2020.09.01 |
---|---|
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #8 (0) | 2020.09.01 |
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #6 (0) | 2020.08.31 |
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #5 (0) | 2020.08.31 |
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #4 (0) | 2020.08.30 |