SQL - DDL, DML, DCL

DB/Common 2010. 12. 20. 11:31

SQL[시퀄 또는 에스 큐 엘]은 데이터베이스에서 정보를 얻거나 갱신하기 위한 표준화된 언어로서 대화형으로 이용하거나, 또는 프로그램 내에 삽입하여 쓸 수 있다. SQL이 ANSIISO의 표준이긴 하지만 표준으로 정해진 사항에 덧붙여, 독자적인 확장 SQL을 지원하는 데이터베이스도 많다.

데이터를 다루는 SQL 문장을 특히 DML이라고 하는데, 다음과 같은 종류가 있다.

  • Select : 검색조건에 맞는 데이터를 선택
  • Insert : 새로운 데이터를 삽입
  • Update : 기존 데이터를 수정
  • Delete : 기존 데이터를 삭제

예를 들어,

     SELECT ALL WHERE age > 24 AND sex = "F" 

이라는 쿼리 문장은 "나이가 25살 이상인 모든 여자(성별에서 여자를 "F"로 했다고 가정)를 찾아라"는 검색 요청이 된다.


DDL(Data Definition Language : 데이터 정의 언어)

DDL[디디엘]은 데이터와 데이터간의 관계를 정의하는데 사용되는 언어이다. 이것은 데이터베이스 내에서 데이터 구조를 만드는데 사용된다. 주요 데이터베이스 관리 시스템은 모두 SQL 데이터 정의 언어를 사용한다.


– 객체의 생성,변경,삭제 명령어 (CREATE , ALTER , DROP, RENAME 등)

          Database,Tablespace,segment,object등을 생성,수정,삭제 잘라내기

          cteate,alter,drop,truncate,rename..

          Autocommit (Rollback불가능,수정불가능)


* DDL 명령은 Autocommit 이라 한번 수행하면 되돌릴 수 없다.

 

DML(Data Manipulation Language : 데이터 조작 언어)

DML[디에멜]은 데이터베이스 내의 데이터를 검색, 저장, 수정 및 삭제를 하는데 사용되는 일련의 명령어들이다. 여기에는 두 가지 형태의 DML들이 있는데, 하나는 절차적 DML로서 사용자가 어떤 데이터가 필요하며, 어떻게 그것을 얻을 수 있는지를 사용자가 일일히 기술하는 것이며, 다른 하나인 비절차적 DML은 단지 어떤 데이터가 필요한지만을 사용자가 기술하는 것이다.


- 레코드 제어 명령어 (SELECT, INSERT, UPDATE ,DELETE )

      - Select(선택) 
      - Insert(삽입) 
      - Update(수정) 
      - Delete(삭제)

 

DCL(Data Control Language

– 객체 권한 부여등의 제어어 (GRANT 등)

      - Grant (권한주기) 
      - Revoke(권한삭제)

'DB > Common' 카테고리의 다른 글

TABLE의 key  (0) 2012.01.09
데이터베이스 언어(DBL; DataBase Language)  (0) 2012.01.03
Table, Field, Record 관계  (0) 2011.12.20
SQL의 기원  (0) 2010.12.20
SQL 설명  (0) 2010.12.20
Posted by linuxism
,

MySQL 접속
$ mysql -u root -p


root 암호 초기화
mysql> UPDATE user SET password=password('new_password'WHERE user='root';
mysql> FLUSH privileges;


데이터베이스 선택 및 보기
mysql> USE mysql;
mysql> SELECT Host, User, Password FROM user;


사용자 추가
- 서버 주소의 경우 localhost, %, 127.0.0.1 도 같이 처리해 줍니다. 
- 외부 접속은 'localhost'  대신에 '%' 를 사용합니다. 
mysql> INSERT INTO user (Host, User, Password) VALUES ('localhost''유저명', password('유저패스워드'));
mysql> INSERT INTO user (Host, User, Password) VALUES ('127.0.0.1''유저명', password('유저패스워드'));
mysql> INSERT INTO user (Host, User, Password) VALUES ('%''유저명', password('유저패스워드'));
mysql> FLUSH privileges;

* password('유저패스워드')에서 반드시 작은따옴표를 사용해야함

root 사용자 원격 접속 되도록 수정
mysql>SELECT Host, User, Password FROM user;
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root | *514F8A4F9D8BBC49B0FBFA7186DD96C8919E8630 | 
| id.server.com      | root |                                           | 
| 127.0.0.1             | root |                                           | 
| localhost             |      |                                           | 
| id.server.com      |      |                                           | 
+-----------------------+------+-------------------------------------------+
요렇게 되어 있는 부분중에 127.0.0.1 이 부분의 host를 외부에서 접속할 수있겠금 변경한다.
% <-- 모든 외부접속 허용
000.000.000.000 <-- 특정 아이피 접속허용
000.000.000.%   <-- 특정 아이피 대역 접속허용으로 변경

mysql>update user set host = '원하는 설정값' where user ='root' and host='127.0.0.1';

을 실행한다.
여기서 주의할 점은 root계정중 host에 localhost라는 컬럼역시 있어야 된다는거다.


사용자 삭제 예
mysql> DELETE FROM user WHERE user='root'  and host='%';


데이터베이스 추가 및 권한 주기
- 모든 권한시 데이터베이스명.* 대신 *.* 로 처리합니다. 
mysql> CREATE DATABASE 데이터베이스명;
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 유저명@localhost IDENTIFIED BY '유저패스워드';
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 유저명@127.0.0.1 IDENTIFIED BY '유저패스워드';
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 유저명@'%' IDENTIFIED BY '유저패스워드';

이렇게 해서 외부접속이 안되면 insert into 구문 잘못 입력시 % 가 잘못 입력되거나 패스워드를 유저 패스워드가 아닌 root 패스워드를 입력했을 가능성이 있습니다. 이 경우 % 를 다시 바꿔주면 됩니다.

mysql> UPDATE INTO user SET Host='%' WHERE user='유저명';
mysql> FLUSH privileges;

이렇게 해주면 외부입력 처리가 됩니다. 



mysql 테이블 명 변경
rename table 원래 테이블명 to 바꿀테이블명;
alter table 테이블명 rename 바꿀테이블명;

1.원래 있던 테이블을 이름만 바꿔서 새로 만들고 싶을때
create table 새테이블명 select * from 원본테이블명

2.테이블 스키마가 같은 경우 데이터 복사할때
insert into tableA select * from tableB

3.테이블이 다른 곳에 복사
create table tableA.fld as select from tableB.fld
create table project.zipcode as select from exam.zipcode;










※ 외부에서 접속 가능 유무 확인 방법

로컬 컴퓨터에서 telnet localhost 3306 또는
다른 컴퓨터에서 telnet xxx.xxx.xxx.xxx 3306


1. my.cnf 수정

$ sudo vi /etc/mysql/my.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
#
# * Fine Tuning

위의 bind-address = 127.0.0.1 부분을 아래처럼 주석처리해 준다.

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
#
# * Fine Tuning


2. 사용자 등록

  • MySQL 실행 및 데이터베이스 선택
  • $ mysql -u root -p
    Enter password:

    mysql> use mysql
    Database changed


  • user 테이블에 데이터 추가
  • mysql> insert into user(host, user, password) values('%', 'root', password('PASSWORD'));

- host 필드에 '%' 데이터를 넣는 것은 어디서든 접속할 수 있다라는 뜻이다.
- 특정 자리에서만 접속하도록 하려면 '192.168.1.131' 처럼 IP 또는 해당 자리에서만 접속이 가능하게 하려면 'localhost' 입력.


  • db 테이블에 데이터 추가
  • mysql> insert into db(host, dbname, user) values('%', 'MYSITE', 'root');

- 위의 필드를 추가 후 각 필드의 값으 확인해 보면 'N' 값이 들어 있는데 이 값을 'Y'로 수정. 

    mysql> update db set Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Create_view_priv='Y', Show_view_priv='Y', Create_routine_priv='Y', Alter_routine_priv='Y', Execute_priv='Y' where user='root';


  • 사용자에게 모든 권한을 주고 싶을 때 다음과 같이 grant 구문을 사용 할 수도 있다.
  • mysql> grant all privileges on *.* to root@'%' identified by 'PASSWORD' width grant option;

    mysql> flush privileges;



3. MySQL 재실행

$ sudo /etc/init.d/mysql restart

or

$ mysqladmin -u root -p reload 



출처 - http://cshong.tistory.com/entry/MySQL-%EC%99%B8%EB%B6%80-%EC%A0%91%EC%86%8D-%ED%97%88%EC%9A%A9








'DB > MySQL' 카테고리의 다른 글

MySQL에서 Create Procedure  (0) 2010.12.21
리눅스에서 my.cnf 설정  (0) 2010.12.21
MySQL Data Type 과 테이블 설계 방법  (0) 2010.12.20
mysql 사용자 관리  (0) 2010.12.19
mysql 명령어  (0) 2010.12.19
Posted by linuxism
,

mysql 사용자 관리

DB/MySQL 2010. 12. 19. 22:58

1. Mysql 사용자계정 추가

우선 간단히 Mysql 계정 생성방법에 대해서 설명드리겠습니다.

Mysql DB서버에는 여러 Database가 존재할것이고 또 많은 User가 존재할겁니다.

 

예를 들자면

User에는  최상위 유저인  Root , 일반유저인 mis13, test   존재한다고 보고

Database에는 Mis13, Testdb, Database가 존재합니다.

 

아래 그림을 보시면 Root 3개의 DB에 접속할 권한을 모두 가지고 있고

mis13 유저는 Mis13이란 DB, test 유저는 TestDB, Databases DB 접속할 권한이 있습니다.


자 그럼 mis13, test의 유저들의 권한을 줘보겠습니다.

우선 사용자를 생성하기 위해서 Root 권한으로 Mysql에 접속을 합니다.

 

#> Mysql  -u root -p

Enter Password : ######

 

mis13 이란 유저가 Mis13이란 DB의 권한을 가지게 해보겠습니다. (암호는 mis1313)

 

mysql> GRANT ALL PRIVILEGES ON Mis13.* to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql> flush privileges;    -> 권한 로드

 

2. 사용자 확인

mysql> use mysql;

mysql> select host, user, password from user;

 

3. 그 밖에 외부에서도 접속하기, 모든 DB권한 주기

어떤 DB도 접속 가능하게 권한을 주는 것은

mysql> GRANT ALL PRIVILEGES on *.*  to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql> flush privileges;

 

외부에서도 접속할 수 있도록 하려면

mysql> GRANT ALL PRIVILEGES on  *.*  to mis13@"%" IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql > flush privileges;

 

GRANT 명령어 말고 Mysql DB 안에 User, DB 테이블에 넣는 법도 있지만 초보분이 사용하시기엔

이 방법이 편하실겁니다.

 

4. 모든 권한이 아닌 부분별 골라서 주기

) mis13 이라는 계정이 전체 데이터베이스에 대해서 select, insert, delete, update 권한만 주고 싶을 경우

mysql>GRANT select, insert, delete, update on *.* to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql> flush privileges;

 

) mis13 이라는 계정이 Mis13 이라는 데이터베이스에 대해서 select, insert, update 권한만 주고 싶을 경우

mysql>GRANT select, insert, update on Mis13.* to mis13@localhost IDENTIFIED BY 'mis1313' WITH GRANT OPTION;

mysql>flush privileges;

 

PS - 함부로 권한을 주진 맙시다.

 

'DB > MySQL' 카테고리의 다른 글

MySQL에서 Create Procedure  (0) 2010.12.21
리눅스에서 my.cnf 설정  (0) 2010.12.21
MySQL Data Type 과 테이블 설계 방법  (0) 2010.12.20
MySQL 외부 접속 사용자 추가  (0) 2010.12.19
mysql 명령어  (0) 2010.12.19
Posted by linuxism
,