DML, TCL, DDL, DCL을 알아보자
DML(Data Manipulation Language)
: 테이블에 데이터 입력
, 수정
, 삭제
=> 데이터의 변경사항을 영구적
으로 저장하기 위해선 COMMIT
명령어를 수행해야 함 (단, sql server는 기본적으로 dml 명령어
를 auto commit
으로 처리
=> 테이블 전체의 데이터를 삭제하는 경우 삭제된 데이터를 로그로 저장
하는 DELETE
보다, 시스템 부하가 적은
TRUNCATE TABLE
권고 (단, truncate table은 삭제된 데이터의 로그가 없어
rollback 불가능
, sql server의 경우 사용자가 임의적으로 트랜잭션 시작 후 truncate table로 데이터 삭제 후 오류
발견 시 rollback
가능)
단일 행 insert 문
: values 절
포함
=> 한 번에 한 행
만 입력
=> into절
의 칼럼명과 values절
의 값
을 서로 1:1 매핑
, 칼럼명 기술 순서는 테이블에 정의된 칼럼 순서와 동일할 필요 X
, into절
에 기술하지 않은 컬럼은 default
로 null
입력
=> Primary key 제약
또는 Not null
제약이 지정된 칼럼은 null 허용X
로 오류 반환
=> char
또는 varchar2
등 문자 유형
일 경우 '
와 함께 값 입력
=> 숫자 유형
일 경우 그냥 숫자만 입력
insert into 테이블명 [(칼럼1, 칼럼2, ...)] values (값1, 값2, ...);
INSERT
INTO PLAYER (PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('2002007', '박지성', 'K07', 'MF', 178, 73, 7);
into절
의 칼럼명
은 생략 가능
=> 테이블에 정의된 칼럼 순서대로 values절
에 모든 값
들을 빠짐없이 기술해야 함
INSERT INTO PLAYER
VALUES ('2002010','이청용','K07','','BlueDragon','2002','MF','17',NULL, NULL,'1',180,69);
미지의 값은 ''
로 표현하거나, Null
이라고 명시적으로 표현 가능
values절
에 서브쿼리
를 사용해 SQL 작성 가능
--현재 사용중인 player_id 최대값에 1을 더한 값 사용
insert into player(player_id, player_name, team_id)
values ((select to_char(max(to_number(player_id))+1) from player,
'홍길동', 'k06');
INSERT문
에 서브 쿼리
사용시 서브쿼리의 결과
를 테이블에 입력 가능
=> 서브 쿼리 결과가 다중 행
이면, 한 번에 여러 건
입력
=> into절
의 칼럼명 개수
와 서브쿼리
의 select 절 칼럼 개수
일치해야 함
insert into 테이블명 [(칼럼1, 칼럼2, ...)]
서브쿼리;
insert into team(team_id, region_name, team_name, orig_yyyy, stadium_id)
select replace(team_id, 'K','A') as team_id,
region_name, region_name||'올스타' as team_name,
2019 as orig_yyyy, stadium_id
from team
where region_name in ('성남', '인천');
--2개 삽입
UPDATE
: 잘못 입력되거나 변경이 발생해 데이터를 수정
해야 하는 경우 사용
=> update 다음에 데이터를 수정할 대상 테이블명
입력
=> set절
에는 수정할 칼럼명
과 수정될 값
기술
=> where절
에는 수정 대상이 될 행을 식별할 수 있도록 조건식
기술
=> where절 X
시 전체 데이터
수정됨
update 테이블명
set 수정할 칼럼명1=수정될 새로운 값1
[, 수정할 칼럼명2=수정될 새로운 값2]
[, ...]
[where 수정 대상 식별 조건식] ;
UPDATE PLAYER
SET POSITION = 'MF'
WHERE POSITION IS NULL;
update문
의 set절
에 서브 쿼리
를 사용하면, 서브 쿼리의 결과
로 값이 수정
=> 서브쿼리가 null 반환시 해당 컬럼 결과 null될 수 있음
update stadium a
set (a.ddd, a.tel) = (select x.ddd, x.tel
from team x
where x.team_id=a.hometeam_id);
-- 20행 갱신
-- 홈팀이 없는 경기장의 DDD가 null로 변경되어버림
update문
의 where절
에 서브 쿼리
를 사용해 수정될 행 식별
가능
-- 홈팀의 정보가 존재하는 경기장의 지역번호를 홈팀으로 바꿈
update stadium a
set (a.ddd, a.tel) = (select x.ddd, x.tel
from team x
where x.team_id=a.hometeam_id)
where exists (select 1
from team x
where x.team_id=a.hometeam_id);
-- team 테이블 두번 조회하는 비효율 => merge문 사용
DELETE
: 테이블에 저장된 데이터가 더이상 필요 없어질 경우 데이터 삭제
수행
=> delete from 다음 삭제할 자료가 저장된 테이블명
입력
=> from
은 생략 가능
=> where절에는 삭제 대상이 될 행을 식별할 수 있는 조건식
기술
=> where절 생략
시 테이블 전체 데이터 삭제
delete [from] 테이블명
[where 삭제 대상 식별 조건식];
delete player
where position='DF'
and join_yyyy<=2010;
delete문
의 where절
에 서브 쿼리
사용시, 다른 테이블 참조해 삭제할 행 식별 가능
-- 소속 선수가 10명 이하인 팀에 소속된 선수 삭제
delete player
where team_id in (select team_id
from player
group by team_id
having count(*)<=10);
MERGE문
: 새로운 행을 입력
하거나, 기존 행을 수정
하는 작업을 한 번에
함
=> merge
다음 입력, 수정되어야 할 타켓 테이블명
입력
=> using절
에 입력, 수정에 사용할 소스 테이블
입력
=> on절
에 타겟 테이블과 소스 테이블간의 조인 조건식
기술
=> on절의 조인 조건
에 성공
한 행은 matched then
으로 update
, 조인에 실패
한 행은 not matched then
수행
merge
into 타겟 테이블명
using 소스 테이블명
on (조인 조건식)
when matched then
update
set 수정할 칼럼명1=수정될 새로운 값1
[, 수정할 칼럼명2=수정될 새로운 값2, ...]
when not matched then
insert [(칼럼1, 칼럼2, ...)]
values (값1, 값2, ...)
;
merge
into team t
using team_tmp s
on (t.team_id=s.team_id)
when matched then
update
set t.region_name=s.region_name,
t.team_name=s.team_name,
t.ddd=s.ddd,
t.tel=s.tel
when not matched then
insert (t.team_id, t.region_id, t.team_name,t.stadium_id,t.ddd,t.tel)
values (s.team_id, s.region_id, s.team_name,s.stadium_id,s.ddd,s.tel);
using절
에 소스 테이블 대신 서브 쿼리
사용 가능
merge
into team t
using (select * from team_tmp where region_name in ('성남','부산','대구','전주')) s
on (t.team_id=s.team_id)
when matched then
update
set t.region_name=s.region_name,
t.team_name=s.team_name,
t.ddd=s.ddd,
t.tel=s.tel
when not matched then
insert (t.team_id, t.region_id, t.team_name,t.stadium_id,t.ddd,t.tel)
values (s.team_id, s.region_id, s.team_name,s.stadium_id,s.ddd,s.tel);
merge update절
또는 merge insert절
을 선택적
으로 사용 가능
merge
into team t
using team_tmp s
on (t.team_id=s.team_id)
when matched then
update
set t.region_name=s.region_name,
t.team_name=s.team_name,
t.ddd=s.ddd,
t.tel=s.tel;
트랜잭션
: 데이터베이스의 논리적 연산단위
=> 밀접히 관련돼 분리될 수 없는
한 개 이상의 데이터베이스 조작
=> 하나 이상의 SQL 문장 포함
=> 분할할 수 없는 최소의 단위
=> 전부 적용
하거나 전부 취소
(ALL OR NOTHING
)
=> 하나의 논리적인 작업 단위
를 구성하는 세부적인 연산
들의 집합
TCL(Transaction Control Language)
: 트랜잭션 제어 명렁어
commit
: 올바르게 반영된 데이터를 데이터베이스에 반영
rollback
: 트랜잭션 시작 이전의 상태로 되돌리
는 명령어savepoint
: 트랜잭션의 일부만 취소
할 수 있게 만드는 명령어insert, update, delete 등이 트랜잭션의 대상
=> select for update
등의 배타적 lock을 요구하는 select는 트랜잭션 대상
잠금(LOCK)
: 트랜잭션이 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한
하는 기법
=> 트랜잭션의 특정(특히 원자성
)을 충족하기 위함
=> 잠금이 걸린 데이터는 잠금을 실행한 트랜잭션
만 독점적으로 접근
가능
=> 다른 트랜잭션으로부터 방해
나 간섭
을 받지 않는 것이 보장
=> 잠금 걸린 데이터는 잠금을 수행한 트랜잭션만
해제 가능
COMMIT
: 입력, 수정, 삭제한 데이터에 대해 전혀 문제가 없을 경우, 트랜잭션 완료
가능
=> insert, delete, update
를 수행한 후 변경 작업
이 완료
됐음을 데이터베이스
에 알려주기 위해 사용
commit
이나 rollback
이전의 데이터 상태
취소
해 이전 상태로 복구 가능
현재 사용자
는 select
로 결과 확인 가능
다른 사용자
는 현재 사용자
가 수행한 명령의 결과 볼 수 없음
잠금(LOCKING)
이 설정돼서 다른 사용자가 변경 불가
delete from player;
-- 481행 삭제
commit;
--커밋 완료
commit
이후 데이터 상태
변경 사항
이 데이터베이스에 반영
이전 데이터
는 영원히 잃어
버리게 됨모든 사용자
는 결과를 볼 수 있음
잠금이 풀리
고, 다른 사용자
들이 행 조작 가능
Oracle
: DBMS
가 트랜잭션 내부적으로 실행
, DML 수행 후, 사용자가 임의로 commit 또는 rollback 수행
해야 트랜잭션 종료
SQL Server
: 기본적으로 Auto Commit 모드
이므로, 사용자가 commit 이나 rollback
처리 할 필요X
=> DML 구문 성공
시 자동으로 commit
, 오류
발생시 자동으로 rollback
delete from player;
--481개의 행이 영향을 받음
SQL Server
에서의 트랜잭션 3가지 방식
AUTO COMMIT
: SQL Server의 기본 방식
, DML과 DDL을 수행할 때마다 DBMS가 트랜잭션 컨트롤
하는 방식암시적 트랜잭션
: Oracle과 같은 방식
으로 처리, 트랜잭션의 시작
은 DBMS가 처리
하고 트랜잭션의 끝
은 사용자
가 명시적으로 commit 또는 rollback 처리인스턴스 단위
(서버 속성 창 연결화면에서 기본연결 옵션 중 암시적 트랜잭션에 체크) 또는 세션 단위
(세션 옵션 중 SET IMPLICIT TRANSACTION ON
사용)로 설정 가능명시적 트랜잭션
: 트랜잭션의 시작
과 끝
모두 사용자
가 명시적으로 지정BEGIN TRANSACTION(BEGIN TRAN 가능)
으로 시작, COMMIT TRANSACTION(TRANSACTION 생략 가능)
또는 ROLLBACK TRANSACTION(TRANSACTION 생략 가능)
으로 종료, ROLLBACK시 최초의 BEGIN TRANS
까지 모두 rollback
ROLLBACK
: 테이블 내 insert, delete, update
한 데이터에 대해 commit 이전
에는 변경 사항을 취소
가능
=> 데이터 변경 사항이 취소돼, 데이터가 이전 상태로 복구
되며, 관련된 행에 대한 잠금이 풀리
고 다른 사용자
들이 데이터 변경 가능
update player set height=100;
--480행 갱신
rollback;
--롤백 완료
SQL Server
는 기본 auto commit
이므로, 임의적
으로 rollback
을 수행하려면 명시적
으로 트랜잭션 선언
해야 함
BEGIN TRAN
update player set height=100;
-- 480개 행 영향
rollback;
--명령 완료
ROLLBACK
이후 데이터 상태
변경 사항
취소
트랜잭션 시작 이전
의 상태로 되돌아감잠금 풀리
고, 다른 사용자
들이 행 조작 가능
rollback
과 commit
사용 효과
데이터 무결성
보장영구적인 변경
을 하기 전 데이터 변경 사항 확인
가능논리적으로 연관된 작업
을 그룹핑
해 처리 가능SAVEPOINT
정의시 rollback
할 때 트랜잭션에 포함된 전체 작업 롤백X
, 현 시점
에서 savepoint까지
트랜잭션의 일부만 롤백
가능
=> 복수의 저장점 정의 가능, 동일 이름
으로 여러 개 정의시 마지막 정의
한 저장점만 유효
--oracle
savepoint svpt1;
--sql server
save transaction svtr1;
저장점까지 롤백
시 rollback 뒤
에 저장점 명
--oracle
rollback to svpt1;
--sql server
rollback transaction svtr1;
저장점 설정 이후
에 있었던 데이터 변경
에 대해서만 원래 데이터 상태
로 되돌림
--savepoint 1
--oracle
savepoint svpt1;
-- 저장점이 생성됐습니다.
insert into player(player_id, team_id, player_name, position, height, weight, back_no)
values ('1997035','k02','이운재','GK',182,82,1);
--1개의 행이 만들어짐
rollback to svpt1;
--롤백 완료
-- SQL Server
BEGIN TRAN
save tran svtr1;
--명령 완료
insert into player(player_id, team_id, player_name, position, height, weight, back_no)
values ('1997035','k02','이운재','GK',182,82,1);
-- 1개 행 영향
rollback tran svtr1;
--명령 완료
--savepoint 2
--oracle
savepoint svpt2;
-- 저장점이 생성됐습니다.
update player set height=100;
--480행 갱신
rollback to svpt2;
--롤백 완료
-- SQL Server
BEGIN TRAN
save tran svtr2;
--명령 완료
update player set height=100;
-- 480개 행 영향
rollback tran svtr2;
--명령 완료
--savepoint 3
--oracle
savepoint svpt3;
-- 저장점이 생성됐습니다.
delete from player;
--480행 삭제
rollback to svpt3;
--롤백 완료
-- SQL Server
BEGIN TRAN
save tran svtr3;
--명령 완료
delete from player;
-- 480개 행 영향
rollback tran svtr3;
--명령 완료
특정 저장점
까지 롤백
시 그 저장점 이후 설정한 저장점
은 무효
=> rollback to A
실행하면 저장점 B
는 존재X
저장점 지정 없이
롤백
시 반영되지 않은 모든 변경 사항
취소
하고 트랜잭션 종료
커밋과 롤백의 목적
: 데이터 변경을 발생시키는 insert, update, delete
명령어 수행 시 변경되는 데이터 무결성
보장
COMMIT과 ROLLBACK
을 실행하지 않아
도 자동
으로 트랜잭션이 종료
되는 경우 (Oracle)
DDL문장
을 실행하면, 자동 커밋
이 수행데이터베이스
를 정상적으로 접속 종료
하면 자동으로 트랜잭션 커밋
애플리케이션 이상 종료
로 데이터베이스와의 접속이 단절
됐을 경우 트랜잭션 자동 롤백
트랜잭션이 자동으로 종료
되는 경우 (SQL Server)
애플리케이션 이상 종료
로 데이터베이스와의 접속이 단절
됐을 경우 트랜잭션 자동 롤백
테이블
: 데이터베이스의 가장 기본적인 객체, 행
과 열
구조로 데이터 저장
=> 테이블 생성
을 위해선 해당 테이블에 입력될 데이터 정의
, 정의한 데이터의 데이터 유형
결정
기본키 칼럼
: 테이블에 존재하는 모든 데이터
를 고유하게 식별
할 수 있으면서, 반드시 값이 존재
하는 단일 칼럼
이나 칼럼의 조합들
중 하나를 선정
테이블과 테이블 간에 정의된 관계
: 기본키
와 외부키
를 활용해 설정
create table 테이블명(
칼럼명1 데이터유형 [기본 값] [NOT NULL],
칼럼명2 데이터유형 [기본 값] [NOT NULL],
칼럼명3 데이터유형 [기본 값] [NOT NULL],
...
);
테이블 생성 시 주의사항
테이블명
은 객체를 의미할 수 있는 적절한 이름 사용, 가능한 단수형
권고테이블명
은 다른 테이블의 이름과 중복X
칼럼명
이 중복X
각 칼럼
들은 괄호()
로 묶어 지정각 칼럼
들은 콤마,
로 구분, 테이블 생성문의 끝은 항상 세미콜론;
칼럼
에 대해서는 다른 테이블까지 고려해 일관성
있게 사용 (데이터 표준화 관점
)칼럼 뒤
에 데이터 유형
은 꼭 지정
테이블명
과 칼럼명
은 반드시 문자
로 시작, 벤더별 길이 한계 벤더
에서 사전에 정의한 예약어
사용 불가A-Z
, a-z
, 0-9
, _
, $
, #
문자만 허용DBMS
는 칼럼
을 DB명+DB사용자명+테이블명+칼럼명
과 같이 계층적 구조
를 가진 전체 경로
로 관리
--oracle
CREATE TABLE PLAYER (
PLAYER_ID CHAR(7) NOT NULL,
PLAYER_NAME VARCHAR2(20) NOT NULL,
TEAM_ID CHAR(3) NOT NULL,
E_PLAYER_NAME VARCHAR2(40),
NICKNAME VARCHAR2(30),
JOIN_YYYY CHAR(4),
POSITION VARCHAR2(10),
BACK_NO NUMBER(2),
NATION VARCHAR2(20),
BIRTH_DATE DATE,
SOLAR CHAR(1),
HEIGHT NUMBER(3),
WEIGHT NUMBER(3),
CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);
테이블
추가 주의 사항
대소문자 구분 X
, 기본적으로 테이블이나 칼럼은 대문자
로 만들어짐DATETIME
데이터 유형은 별도로 크기 지정X
문자 데이터 유형
은 반드시 가질 수 있는 최대 길이
표시마지막 칼럼
은 콤마 X
제약조건
은 CONSTRAINT
를 이용해 추가칼럼 LEVEL 정의 방식
: 제약조건
을 각 칼럼
의 데이터 유형 뒤에 기술
테이블 LEVEL 정의 방식
: 제약조건
을 테이블 정의 마지막에 기술
제약조건(CONSTRAINT)
: 사용자가 원하는 조건의 데이터
만 유지하기 위한, 즉 데이터 무결성
을 유지하기 위한 데이터베이스의 보편적인 방법
=> 테이블
의 특정 칼럼
에 설정하는 제약
DEFAULT
: 데이터 입력 시 칼럼 값을 지정하지 않은 경우 null값
이 입력되는데, default값을 정의했다면 null값 대신
정의된 기본값(default)
이 자동 입력--oracle
DESCRIBE 테이블명;
-- 또는
DESC 테이블명;
--sql server
exec sp_help 'dbo.테이블명'
go
CTAS, Create Table ~ As Select ~
: select 문장을 활용해 테이블 생성
=> 기존 테이블을 이용하여 데이터 유형
을 다시 정의하지 않아도
됨
=> 기존 테이블 제약조건
중 NOT NULL제약
만 적용
됨
=> 기본키,고유키,외래키,CHECK
등의 다른 제약조건
은 없어짐
Select ~ Into ~
: SQL Server
의 CTAS
=> 칼럼 속성
에 Identity(시퀀스 같은 것)
를 사용했다면, Identity
속성까지 같이 적용
--oracle
create table team_temp
as select * from team;
--sql server
select * into team_temp from team;
ALTER TABLE
: 칼럼
을 추가/삭제
하거나 제약조건
을 추가/삭제
하는 등 테이블 구조 변경
ADD COLUMN
: 테이블에 필요한 칼럼 추가
--oracle
ALTER TABLE 테이블명
ADD(추가할 칼럼명1 데이터유형 [기본 값] [NOT NULL]
[, 추가할 칼럼명2 데이터유형 [기본 값] [NOT NULL]
, ...]);
--sql server
ALTER TABLE 테이블명
ADD 추가할 칼럼명1 데이터유형 [기본 값] [NOT NULL]
[, 추가할 칼럼명2 데이터유형 [기본 값] [NOT NULL]
, ...];
새롭게 추가된 칼럼
은 테이블의 마지막 칼럼
이 되며, 칼럼 위치 지정
은 불가
alter table player add (address varchar2(80));
DROP COLUMN
: 테이블에서 필요 없는 칼럼 삭제
=> 데이터가 있거나 없거나
모두 삭제 가능
=> 칼럼 삭제 후 최소 하나 이상
의 칼럼이 테이블에 존재해야 함
=> 한 번 삭제된 칼럼 복구 불가
--oracle
ALTER TABLE 테이블명 DROP (삭제할 칼럼명1 [, 삭제할 칼럼명2, ...]);
--sql server
ALTER TABLE 테이블명 DROP COLUMN 삭제할 칼럼명1 [, 삭제할 칼럼명2, ...];
ALTER TABLE PLAYER DROP COLUMN ADDRESS;
MODIFY COLUMN
: 테이블에 존재하는 칼럼에 대해 데이터 유형
, 디폴트 값
, NOT NULL 제약조건
에 대해 변경
--oracle
ALTER TABLE 테이블명
MODIFY ( 칼럼명1 데이터유형 [기본 값] [NOT NULL]
[, 칼럼명2 데이터유형 [기본 값] [NOT NULL]
, ...]);
--sql server
ALTER TABLE 테이블명 ALTER COLUMN 칼럼명 데이터유형 [NOT NULL];
칼럼 변경
시 고려사항
칼럼 크기
를 늘릴
수는 있지만, 테이블에 데이터가 존재한다면 칼럼의 크기를 줄이는 데
제약
기존 데이터
가 훼손될 수 있기 때문NULL값
만 갖고 있거나 테이블에 아무 행도 없
으면 칼럼 크기 줄이기 O
NULL값
만 갖고 있으면 데이터 유형 변경O
default값
을 바꾸면 변경 작업 이후
발생하는 행 삽입에만 영향null값
이 없을 경우
에만 not null 제약조건
추가 가능--oracle
ALTER TABLE TEAM_TEMP MODIFY (ORIG_YYYY VARCHAR2(8) DEFAULT '20020129' NOT NULL);
--sql server
ALTER TABLE TEAM_TEMP ALTER COLUMN ORIG_YYYY VARCAHR(8) NOT NULL;
-- 명령 완료
ALTER TABLE TEAM_TEMP ADD CONSTRAINT DF_ORIG_YYYY DEFAULT '20020129' FOR ORIG_YYYY;
RENAME COLUMN
: 칼럼명을 변경
--oracle
ALTER TABLE 테이블명 RENAME COLUMN 기존 칼럼명 TO 새로운 칼럼명;
--sql server
sp_rename '기존 칼럼명', '새로운 칼럼명', 'COLUMN';
RENAME COLUMN
으로 칼럼명이 변경되면, 해당 칼럼과 관계된 제약조건
에 대해서도 자동으로 변경
--oracle
ALTER TABLE PLAYER RENAME COLUMN TEMP_ID TO PLAYER_ID;
--sql server
sp_rename 'dbo.PLAYER.PLAYER_ID', 'TEMP_ID', 'COLUMN';
DROP CONSTRAINT
: 테이블 생성 시 부여했던 제약조건 삭제
ALTER TALBE 테이블명 DROP CONSTRAINT 제약조건명;
ALTER TABLE PLAYER DROP CONSTRAINT PLAYER_FK;
ADD CONSTRAINT
: 특정 칼럼에 제약조건
을 추가
ALTER TALBE 테이블명 ADD CONSTRAINT 제약조건명 제약조건(칼럼명);
ALTER TABLE PLAYER ADD CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);
참조 제약조건
을 추가하면, 참조 무결성 옵션
에 따라 데이터를 삭제
하려는 경우, 외부 테이블
에서 참조
되고 있기 때문에 삭제가 불가능
하게 제약 가능
=> 외래키 설정
을 통해 실수에 의한 테이블 삭제
나 필요 데이터의 의도하지 않은 삭제
를 방지 가능
RENAME TABLE
: 테이블의 이름 변경
--oracle
RENAME 기존 테이블명 TO 새로운 테이블명;
--sql server
sp_rename '기존 테이블명', '새로운 테이블명';
--oracle
RENAME TEAM TO TEAM_BACKUP;
--sql server
sp_rename 'dbo.TEAM','TEAM_BACKUP';
DROP TABLE
: 불필요한 테이블 삭제
DROP TABLE 테이블명 [CASCADE CONSTRAINT];
모든 데이터
및 구조
삭제cascade constraint
: 해당 테이블과 관계 있었던 참조 제약조건
도 삭제
(sql server는 cascade 옵션 존재X, 테이블 삭제 전 foreign key 제약 조건
또는 참조하는 테이블
삭제해야 함)DROP TABLE PLAYER;
TRUNCATE TABLE
: 테이블 자체가 삭제되는 것은 아니고, 모든 행들이 제거
되고 저장 공간
을 재사용 가능하도록 해제
TRUNCATE TABLE 테이블명;
TRUNCATE TABLE TEAM;
drop table
: 테이블 자체
가 없어지기 때문에, 테이블 구조 확인 불가
truncate table
: 테이블 구조
는 유지한 채 데이터만 삭제
=> auto commit
됨 (정상적인 복구 불가능)
DCL(Data Control Language)
: 유저 생성
및 권한 제어
명령어
운영 시스템에서 사용하던 유저를 공개하면, 데이터 손실
의 우려가 커짐
=> 새로운 유저
를 생성하고, 생성한 유저
에게 공유할 테이블 및 오브젝트
에 대한 접근 권한
부여해 문제 해결
대부분 데이터베이스
는 데이터 보호
와 보안
을 위해 유저
와 권한
관리
오라클
에서 제공하는 유저들
유저 | 역할 |
---|---|
SCOTT | Oracle 테스트용 샘플 계정 Default 패스워드 : TIGER |
SYS | 백업 및 복구 등 데이터베이스 상 모든 관리 기능 수행 가능한 최상위 관리자 계정 |
SYSTEM | 백업, 복구 등 일부 관리 기능 제외 모든 시스템 권한 부여받은 DBA 계정 (Oracle 설치 시 패스워드 설정) |
오라클
은 유저
를 통해 데이터베이스
에 접속
=> 아이디
와 비밀번호
방식으로 인스턴스에 접속
, 그에 해당하는 스키마
에 오브젝트 생성
등의 권한 부여
SQL Server
는 인스턴스 접속
을 위해 로그인
을 생성
=> 인스턴스 내
에 존재하는 다수의 데이터베이스
에 연결해 작업하기 위해 유저 생성
후 로그인
과 유저
매핑
=> 특정 유저
는 특정 데이터베이스 내 특정 스키마
에 대해 권한 부여
SQL Server 로그인 방식
마이크로소프트 윈도우 운영체제 인증 방식
: 윈도우
에 로그인
한 정보를 가지고 접속운영체제
의 윈도우 보안 주체 토큰
을 사용해 계정 이름
과 암호
가 유효한지 확인
, 즉 윈도우
에서 사용자ID
확인암호 요청X
, ID 유효성 검사 X
안전
kerberos 보안 프로토콜
사용트러스트된 연결
혼합 모드(Windows 인증 또는 SQL 인증) 방식
: Oracle
처럼 사용자 아이디
와 비밀번호
로 접속사용자
가 실행하는 모든 DDL문장
은 권한
이 있어야 실행 가능 => 시스템 권한
유저 생성 권한(CREATE USER)
: 새로운 유저 생성
시 필요한 권한
--oracle
CONN SCOTT/TIGER
--SCOTT 유저로 접속
create user sqlp identified by db2024;
--권한 불충분
DBA
권한을 갖고 있는 SYSTEM
유저로 접속하면, 유저 생성 권한
을 다른 유저
에게 부여
가능
--oracle
grant create user to scott;
conn scott/tiger
create user sqlp identified by db2024;
--사용자 생성
SQL Server
는 유저 생성 전
에 로그인 생성
해야 함
=> 로그인 생성
가능한 권한
을 가진 로그인은 sa
-- sql server
-- 로그인 후 최초로 접속할 데이터베이스는 AdventureWorks 데이터베이스로 설정
create login sqlp with password='db2024', default_database=AdventureWorks;
sql server
에서 유저
는 데이터베이스마다
존재
=> 유저 생성을 위해선 생성하고자 하는 유저가 속할
데이터베이스
로 이동
한 후 처리
-- sql server
use adventureworks;
go
create user sqlp for login sqlp with default_schema=dbo;
유저가 생성
되었으나, 아무런 권한도 부여받지 못해
로그인
을 하면, create session 권한
이 없다는 오류 발생
=> 유저가 로그인을 하려면 create session 권한
을 부여받아야 함
grant create session to sqlp;
conn sqlp/db2024;
--연결
로그인 권한
만 부여됐으므로 테이블 생성
을 위해선 테이블 생성 권한(create table)
이 불충분하다는 오류 발생
--oracle
grant create table to sqlp;
--sql server
use adventureworks;
go
grant create table to sqlp;
--스키마에 권한 부여
grant control on schema::dbo to sqlp;
OBJECT(객체) 권한
: 특정 오브젝트
인 뷰
, 테이블
등에 대한 SELECT, INSERT, DELETE, UPDATE
등 작업 명령어 의미
모든 유저
는 자신이 생성한 테이블 외
에 다른 유저의 테이블
에 접근
하려면 해당 테이블에 대한 오브젝트 권한
을 소유자
로부터 부여
받아야 함
=> sql server는 유저가 스키마
에 대한 권한만을 가지므로 테이블
과 같은 오브젝트는 유저
가 소유하는 것이 아닌
스키마가 소유
하게 되며 유저는 스키마에 대해 권한
을 가짐
다른 유저
가 소유한 객체에 접근하려면 객체 앞
에 객체를 소유한 유저의 이름
을 붙여야 함
=> sql server는 객체 앞
에 소유한 유저 이름 대신 객체가 속한 스키마 이름
을 붙임
grant select on menu to scott;
--oracle
select * from sqlp.menu;
--sql server
select * from dbo.menu;
select 권한
만 부여받았으므로 update, insert, delete
와 같은 다른 작업
은 불가능
=> 오브젝트 권한
은 SELECT, INSERT, UPDATE, DELETE
등 따로 권한
관리
ROLE
: 유저
들과 권한
들 사이에서 중개 역할
=> 데이터베이스 관리자는 role
을 생성하고 role
에 각종 권한 부여
후, role
을 다른 role
이나 유저
에게 부여
ROLE
에는 시스템 권한
과 오브젝트 권한
모두 부여
가능
--권한을 취소할 때는 REVOKE 사용
--oracle
revoke create session, create table from sqlp;
--역할 생성 시 CREATE ROLE
-- ROLE 만들고, SQLP 유저에게 부여
create role login_table;
grant create session, create table to login_table;
grant login_table to sqlp;
ROLE
을 사용해 권한을 부여하는 것이 직접 부여
하는 것 보다 빠르
고 안전
하게 유저 관리 가능
CONNECT ROLE과 RESOURCE ROLE에 포함된 권한 목록 (Oracle)
CONNECT | RESOURCE |
---|---|
CREATE CLUSTER | |
CREATE INDEXTYPE | |
CREATE OPERATOR | |
CREATE SESSION | CREATE PROCEDURE |
CREATE SEQUENCE | |
CREATE TABLE | |
CREATE TRIGGER | |
CREATE TYPE |
일반적으로 유저 생성 시 CONNECT
와 RESOURCE ROLE
을 사용해 기본 권한
부여
DROP USER
: 유저를 삭제
하는 명령어
=> CASCADE 옵션
: 해당 유저가 생성한 오브젝트 먼저 삭제
후 유저 삭제
drop user sqlp cascade;
--menu 테이블도 같이 삭제됨
create user sqlp identified by db2024;
grant connect, resource to sqlp;
SQL Server
에서는 ROLE
을 생성해 사용하기보다는 기본적으로 제공
되는 ROLE
에 멤버
로 참여
하는 방식으로 사용
특정 로그인
이 멤버
로 참여할 수 있는 서버 수준 역할(ROLE)
데이터베이스
에 존재하는 유저
가 참여할 수 있는 데이터베이스 수준 역할
의 멤버
인스턴스 수준
의 작업이 필요한 경우 서버 수준 역할
부여, 작은 개념인 데이터베이스 수준
의 권한
이 필요한 경우 데이터베이스 수준 역할
부여
=> 로그인
에게는 서버 수준 역할
(인스턴스 수준 요구)
=> 사용자
에게는 데이터베이스 수준 역할
(데이터베이스 수준 요구)