Programming/데이터베이스

[MySQL] 데이터 제어문 DCL

Bam_t 2022. 1. 23. 16:19
728x90

MySQL의 세 명령 구분 중 마지막인 데이터 제어문입니다.

데이터 제어문은 주로 데이터베이스에 대한 권한을 다루는 명령입니다.


1. CREATE USER

우리는 처음 MySQL을 설치할 때 설치과정에서 관리자 계정(root)을 만들고 사용했습니다. 우리가 혼자서 사용할 땐 문제되지 않지만, 실제 상황에선 관리자 용 하나를 쓰기보단 여러 계정을 들고 각자 관리하게 됩니다. 새로운 데이터베이스 계정을 생성하기 위해서는 CREATE USER 명령을 사용합니다.

이 명령은 모든 계정에서 가능한 것은 아니고 권한이 필요한데 보통 유저 생성은 root계정으로 생성합니다. CREATE USER 명령은 다음과 같이 사용합니다.

이 명령의 주의점은 MySQL에서는 사용자 계정이 mysql이라는 데이터베이스의 user 테이블에 저장됩니다. 그래서 반드시 계정 생성(혹은 삭제)하기 전에 use 명령을 통해 mysql 테이블에서 작업을 해야합니다.

CREATE USER 계정명@호스트 IDENTIFIED BY 비밀번호;

'호스트'이라는 단어가 등장하는데, 호스트는 일종의 접근 제한입니다. 대표적으로 호스트에 'localhost', %, IP주소가 올 수 있습니다.

localhost는 로컬 환경에서만 접속이 가능한 계정을, %는 외부 환경에서도 접근이 가능한 계정을, IP주소를 넣으면 해당 IP주소에서만 접근이 가능한 계정을 생성하게 됩니다.

추가적으로 방금 전 주의점에서 mysql 데이터베이스의 user라는 테이블에 계정이 저장된다고 했는데, 이것도 역시 테이블이므로 계정 추가를 INSERT 명령으로도 할 수 있습니다.

INSERT INTO user(host, user, authentication_string)
VALUES (호스트, 유저명, password('비밀번호'));

 

 

 

2. DROP USER

DROP USER는 사용자 계정을 삭제하는 명령입니다. 이 명령 역시 권한이 필요합니다. DROP USER는 다음과 같이 사용합니다.

DROP USER 계정명@호스트;

이 역시도 DELETE 명령으로 유저 삭제가 가능합니다.

DELETE FROM user WHERE User = 유저명;

 

 

 

3. GRANT

GRANT 명령은 사용자 계정에 대해 권한을 관리하는 명령입니다. 모든 계정이 삽입, 삭제, 수정 권한을 가진다면 보안 관리에 문제가 생기게 됩니다. 그러므로 GRANT 명령으로 권한을 조정할 필요가 있습니다.

GRANT의 사용법은 사용자 계정 생성과 동시에 권한을 조정하는 방식과 이미 존재하는 사용자 계정의 권한을 조정하는 방법 두 가지가 있습니다.

먼저 생성과 동시에 권한을 조정하는 방식을 알아보겠습니다.

GRANT 권한
ON 데이터베이스명.테이블명
TO 계정명@호스트
IDENTIFIED BY 비밀번호;

권한은 INSERT, ALTER, DELETE, DROP, UPDATE 등의 명령에 대한 권한을 적으면 됩니다. 만약 모든 권한을 주고 싶다면 권한에 'ALL PRIVILEGES'라고 적으면 됩니다.

또한 마지막에 추가적으로 WITH GRANT OPTION이라는 구문이 올 수 있는데, 이 구문을 이용하면, 생성한 계정이 생성하는 다른 계정에 대해서도 동일한 권한을 받게 됩니다.

 

이번에는 이미 존재하는 계정에 권한을 부여하는 방법을 알아보겠습니다.

GRANT 권한 ON 데이터베이스명.테이블명 
TO 계정명@호스트;

*.* 혹은 데이터베이스명.*를 통해 모든 데이터베이스 혹은 데이터베이스 내의 모든 테이블에 대한 권한을 줄 수 있습니다.


사용자 권한을 간단하게 확인할 수 있는 명령도 존재합니다.

SHOW GRANT FOR 계정명@호스트;

 

 

 

4. REVOKE

REVOKE 문은 GRANT의 반대 동작, 권한을 뺏는 기능을 수행합니다. 동작이 반대이므로 사용방법도 GRANT를 REVOKE 변경하기만 하면 REVOKE 명령이 수행됩니다.

REVOKE 권한
ON 데이터베이스명.테이블명
FROM 계정명@호스트;

차이점은 계정명을 연결할 때 TO가 아닌 FROM이 왔습니다.

또 다른 차이점으로는 REVOKE 명령에서도 WITH GRANT OPTION을 사용할 수 있는데, REVOKE 명령에서 사용할 경우, 해당 계정만 권한을 뺏고, 해당 계정에서 생성한 계정들에 대해서는 권한을 뺏지 않게 되는 옵션이 됩니다.

 

 

5. RENAME USER

RENAME USER는 계정명을 변경하는 명령입니다. 

RENAME USER 기존_계정명@호스트 TO 변경할_계정명@호스트;

 

 

 

6. SET PASSWORD

SET PASSWORD 명령은 사용자 계정의 비밀번호를 설정하는 옵션입니다. 계정 생성 시에 비밀번호를 설정하지 않았거나, 계정의 비밀번호를 변경하고 싶은 경우 이 명령어로 비밀번호를 설정할 수 있습니다.

SET PASSWORD FOR 계정명@호스트 = PASSWORD('비밀번호');

이 구문에서 'FOR 계정명@호스트' 구문은 생략이 가능한데, 이것을 생략할 경우 현재 로그인한 계정의 비밀번호를 변경하게 됩니다.

SET PASSWORD = PASSWORD('비밀번호');

 

마찬가지로 유저 정보가 mysql 데이터베이스의 user 테이블에 저장되어 있으므로 UPDATE 명령으로도 설정이 가능합니다.

UPDATE mysql.user
SET PASSWORD = PASSWORD('비밀번호')
WHERE User = 유저명 AND Host = 호스트;

 

728x90