본문 바로가기

Kitri_NCS3기 보안과정/DB보안

170531 사용자 데이터의 수정 DML

DML(Data Manipulation Language)는 데이터를 입력, 수정, 삭제의 작업을 할 수 있습니다. INSERT , UPDATE, DELETE 명령어를 사용합니다.


INSERT

 새로운 행 또는 행들을 테이블에 입력

 UPDATE 

 테이블에 입력된 행 또는 행들의 컬럼(들)의 데이터를 수정합니다.  

 DELETE 

 테이블에 저장된 행 또는 행들을 삭제합니다.


트랜젝션 : DML 작업이 처리되는 과정, 논리적 작업단위를 형성하는 DML문장들의 모음


트랜잭션을 종료하는 COMMIT / ROLLBACK


- COMMIT : DML문장 완료후 변경 후의 데이터 상태를 저장하고 트랜잭션 종료

- ROLLBACK : DML 문장 완료후 변경 전의 데이터 상태로 돌려놓고 트랜잭션 종료


오라클에서는 DML사용시 자동 COMMIT 기능이 지원되지 않기 때문에 DML 작업후에 COMMIT / ROLLBACK 과정을 처리해 주어야 한다.


INSERT>>


한 행입력 

INSERT INTO 테이블 (컬럼) VALUES (컬럼에 들어갈 값)


- 테이블에 정의된 모든 컬럼의 수와 순서대로 값을 입력하는것을 권장한다.

- INSERT INTO 절에 테이블만 정의할 경우 컬럼은 모든 컬럼이 정의된다.

- 명시된 컬럼에 값을 입력하지않을경우 NULL이 들어간다. 

- 값을 입력할때 빈값은 NULL키워드를 명시하여 입력해주는것이 좋다.(오라클에선 '' 도 같은의미)

- 입력값을 함수로 지정 할 수 있다. (date형식의 컬럼에 sysdate로 넣어준다던지)




여러 행 입력 

서브쿼리를 사용하여, 테이블에 0개 이상의 행을 입력할 수 있습니다.

INSERT INTO 테이블 (컬럼) SUBQUERY


- 서브쿼리의 select 절에 기술된 컬럼의 개수와 순서가 INSERT 될 컬럼의 갯수와 순서가 동일해야한다.

- 서브쿼리의 WHERE절에서 추출된 레코드를 입력하게 됩니다. 

- 서브쿼리의 WHERE절에서 만족하는 조건이없을 경우 '0 개의 행이 삽입되었습니다.'



INSERT 문 처리시 에러가 발생하는 경우


• NOT NULL 제약-조건이 지정된 컬럼에 [값이 없는 상태]로 입력을 시도하면 에러가 발생됩니다.

• UNIQUE, PRIMARY KEY 제약-조건을 위반하는 중복된 값을 입력하려고 시도하면 에러가 발생됩니다.

• CHECK 제약-조건을 위반하는 값을 입력하려고 시도하면 에러가 발생됩니다.

• FOREIGN KEY 제약-조건을 위반하는 값을 입력하려고 시도하면, 에러가 발생됩니다.

• 컬럼과 데이터 유형이 다른 데이터를 입력하려고 시도하면 에러가 발생됩니다.

• 컬럼에 설정된 최대 길이보다 길이(WIDTH)가 긴 데이터를 입력하려고 시도하면 에러가 발생됩니다..




UPDATE >>

: UPDATE 문은 WHERE절을 어떻게 작성하느냐에 따라 0개이상의 행을 업데이트 할 수 있습니다. 


UPDATE 테이블 SET 컬럼 = 값 WHERE = 행기준값


- update문에서는 상태를 정의하는것이 아닌 값을 정의하기 때문에 NULL값을 입력할때 '=' 을 사용한다. 

- 형식에 유의 해야하는데 날짜 형식의 경우 TO_DATE() 함수로 처리하는것이 좋다.

- UPDATE 역시 서브쿼리를 이용해 값을 변경 할 수 있습니다. 하지만 컬럼에 들어가는 값이 하나의 행에 하나의 컬럼인 경우 등을 신경써야합니다.




DELETE >>

 UPDATE 문은 WHERE절을 어떻게 작성하느냐에 따라 0개이상의 행을 삭제 할 수 있습니다. 


행을 삭제

 DELETE FROM 테이블 WHERE 컬럼 = 값


모든 행을 삭제 :
업데이트문에서 WHERE 절을 제거하면 모든 행이 제거됩니다.

 UPDATE 테이블 SET 컬럼 = 값


 DELETE FROM 테이블


TRUNCATE TABLE 문장을 이용한 테이블 절단

TRUNCATE TABLE 테이블 ;

DELETE에 비해 수행속도가 월등히 빠른데 그 이유는 DDL문이기 때문에 실행과 동시에 자동 COMMIT이 되기 때문이다. 

이게 무슨뜻이냐 UNDO로 저장되는 다른 저장 위치에서 작업을 수행할 필요가없이 그냥 삭제만 시켜버리고 쌩까면되기 때문에 빠른것이다. 

대신에 ROLLBACK이 안된다.


-DELETE 문도 서브쿼리를 사용할 수 있다. 


위의 SQL문의 경우 LIKE로 반환되는 결과가 1개가 반환이 되긴 했지만 저 방식으로 사용하는 경우 여러개일 가능성이 있기 때문에 좋은 방법은 아닙니다. 

※ 그 외 


-mariaDB, MySQL 의 경우 INSERT에서 컬럼정의할때 AUTOINCREMENT라는 자동숫자입력 함수가 사용되는데 이 경우에는 모든 컬럼을 명시해 주어야 한다. 


- UNDO : Oracle에서만 제공하는 기능, 서버프로세스가 DML문으로 인해 변경되기 전의 테이블상태를 디스크에 저장해놓는것을 말합니다. 이 기능을 이용해서 ROLLBACK등을 할 수 있습니다. 


- 트랜잭션을 COMMIT/ROLLBACK으로 정의해주지않을 경우에 진행되는 DML문장들은 모두 하나의 트랜잭션으로 묶어서 처리하게 된다. 

트랜잭션이 끝나지않을 경우 LOCK이라는 상태에 걸리는데 오라클은 이 LOCK 상태를 해당 작업중인 행에만 영향을 준다. (다른 DB는 테이블 자체를 LOCK 한다고 함. ) 이때 LOCK 상태에서 다른 세션에서 접근할 경우 UNDO에 있던 이전 COMMIT 상태의 데이터를 보여준다고 합니다. DML중의 LOCK 상태는 다른 세션에서의 DML을 거부하지만 오라클은 SELECT작업은 트랜잭션 상태로 여기지 않기 때문에 LOCK 상태의 행에서 데이터를 확인 할 수 있습니다. 하지만 트랜잭션이 끝나지않았기 때문에 전에 COMMIT 됬던 UNDO에 저장된 값을 보여주는거죠. 트랜잭션에 대한 내용은 나중에 더 배운다고 함.