[Database] 임시 테이블
2021. 8. 17. 11:27

● 임시 테이블 이란?

- 이름처럼 임시로 잠깐 사용되는 테이블

- 테이블을 생성할 때 테이블 이름 앞에 '#' 또는 '##'을 붙이면 임시 테이블로 생성된다.

- '#'을 앞에 붙인 테이블은 '로컬 임시 테이블' 이라고 부르는데, 이는 테이블을 생성한 사람만 사용할 수 있다. 즉, 다른 사용자는 해당 테이블이 있는지조차 모른다.

- '##'을 앞에 붙인 테이블은 '전역 임시 테이블' 이라고 부르는데, 이는 모든 사용자가 사용할 수 있는 테이블이다.

 

● 임시 테이블이 삭제되는 시점

- 사용자가 DROP TABLE로 직접 삭제

- SQL Server가 재시작 되면 삭제

- 로컬 임시 테이블(#)은 생성한 사용자의 연결이 끊기면 삭제됨(즉, 쿼리 창이 닫히면 삭제됨)

- 전역 임시 테이블(##)은 생성한 사용자의 연결이 끊기고 이 테이블을 사용 중인 사용자가 없을때 삭제됨

 

-- (쿼리 창1) 로컬 임시테이블(#)과 전역 임시 테이블(##)을 생성
USE tableDB;
CREATE TABLE #tempTbl (ID INT, txt NVARCHAR(10));
GO
CREATE TABLE ##tempTbl (ID INT, txt NVARCHAR(10));

-- (쿼리 창1) 데이터를 입력
INSERT INTO #tempTbl VALUES(1, N'지역임시테이블');
INSERT INTO ##tempTbl VALUES(2, N'전역임시테이블');
GO

-- (쿼리 창1) 테이블을 조회
SELECT * FROM #tempTbl;
SELECT * FROM ##tempTbl;

-- (쿼리 창1) 임시 테이블은 어느 데이터베이스에서도 똑같이 조회 가능
USE master;
SELECT * FROM #tempTbl;
SELECT * FROM ##tempTbl;
-- (쿼리 창2) 전역 임시 테이블 조회
SELECT * FROM ##tempTbl; -- 조회 가능

-- (쿼리 창2) 지역 임시 테이블 조회
SELECT * FROM #tempTbl;

----------------------------------------------
메시지 208, 수준 16, 상태 0, 줄 5
개체 이름 '#tempTbl'이(가) 유효하지 않습니다.

완료 시간: 2021-08-17T11:22:07.9759504+09:00
----------------------------------------------

-- (쿼리 창2) 전역 임시 테이블 조회
SELECT * FROM ##tempTbl; -- 조회 가능

-- (쿼리 창2) 지역 임시 테이블 조회
SELECT * FROM #tempTbl;

-- (쿼리 창2) 전역 임시 테이블을 계속 사용중으로 설정하는 작업
BEGIN TRAN
	INSERT INTO ##tempTbl VALUES (2, N'새 쿼리창에서 입력');

-- 위에 사용했던 쿼리 창1을 닫는다
-- (쿼리 창2) 전역 임시 테이블 조회
SELECT * FROM ##tempTbl; -- 생성했던 쿼리 창1이 닫혔지만 전역임시테이블을 사용 중이므로 아직 조회가능

-- (쿼리 창2) 트랜잭션을 커밋하고, 다시 조회
COMMIT TRAN;
SELECT * FROM ##tempTbl;
----------------------------------------------
메시지 208, 수준 16, 상태 0, 줄 5
개체 이름 '##tempTbl'이(가) 유효하지 않습니다.

완료 시간: 2021-08-17T11:22:07.9759504+09:00
----------------------------------------------

 

- 이처럼 전역 임시 테이블도 더 이상 사용하는 사용자가 없고, 기존의 생성했던 세션(쿼리 창1)도 이미 닫혔으므로 자동삭제된다.

'프로그래밍 > Database' 카테고리의 다른 글

[Database] 트랜잭션의 예시  (0) 2021.08.17
[Database] 스키마(Schema)  (0) 2021.08.17
[Database] 스파스 열  (0) 2021.08.17
[Database] 조인(JOIN)  (0) 2021.08.11
[Database] 트리거의 기본용도  (0) 2021.07.27