원본 테이블(members)
mysql> desc members;
+-------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
가상 테이블(members_v) 생성
mysql> CREATE VIEW members_view as SELECT username FROM members;
Query OK, 0 rows affected (0.01 sec)
id, password 같은 필요하지 않은(민감한) 정보를 제외하고 username만을 참조해서 members_view라는 가상 테이블을 생성해 주었다.
mysql> show tables;
+-------------------------+
| Tables_in_example_db |
+-------------------------+
| members |
| members_view |
+-------------------------+
show tables 명령어로 members_view라는 새로운 테이블이 생성된 것을 확인
mysql> desc members_view;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)
"username" 컬럼이 원본 테이블의 것을 그대로 복사된 것을 확인
mysql> SELECT * FROM members_view;
+-------------+
| username |
+-------------+
| abcd123 |
| test |
| aaaa1234 |
+-------------+
다만 그냥 테이블을 생성한 것과 다르게 가상 테이블 안에는 원본 테이블의 데이터가 그대로 옮겨져 있다.
mysql> INSERT INTO members(username, password) VALUES('example123', '1234');
Query OK, 1 row affected (0.01 sec)
원본 테이블에 임의로 새로운 유저를 등록해 준다.
mysql> SELECT * FROM members_view;
+-------------+
| username |
+-------------+
| abcd123 |
| test |
| aaaa1234 |
| example123 |
+-------------+
가상 테이블의 데이터를 가져오면 마찬가지로 새로운 유저가 보이는 것을 확인 가능하다.
이렇게 뷰(View)를 통해 기본 테이블에 접근하는 것을 차단하고 기본 테이블에 허용하는 컬럼에 대해서만 뷰를 통해 제공함으로써 권한 없는 사용자로부터 민감한 데이터를 은닉시킬 수 있다.
하지만 View만으로는 권한 없는 사용자에게 데이터가 노출되는 것을 제한할 수는 있지만 데이터베이스 객체에 수행하는 작업(DML/DDL)에 대해 제한할 수 있는 방법이 아니므로 이에 대한 작업 권한 제한은 DCL문(GRANT/REVOKE)을 사용한다.
https://janger.tistory.com/724
MySQL - 사용자 권한 부여(grant), 취소(revoke)
모든 권한(SELECT, INSERT, UPDATE, DELETE 등) 부여 (GRANT 권한 ON 데이터베이스.테이블 TO 유저@호스트) GRANT all privileges ON db_name.* TO username@localhost identified by '비밀번호'; username에게 db_name이라는 데이터베
janger.tistory.com