스키마 테이블

스키마 테이블 (Schema Table)

모든 SQLite 데이터베이스에는 그 데이터베이스의 스키마를 저장하는 단일 "스키마 테이블"이 있어요. 데이터베이스의 스키마란 데이터베이스 안에 포함된 다른 모든 테이블, 인덱스, 트리거, 뷰에 대한 설명이에요. 스키마 테이블은 다음과 같이 생겼어요.

출처: 문서

본문

CREATE TABLE sqlite_schema(
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);

sqlite_schema 테이블은 스키마 안의 각 테이블, 인덱스, 뷰, 트리거(모두 합쳐 "객체"라고 불러요)마다 한 행씩을 포함해요. 단, sqlite_schema 테이블 자체에 대한 항목은 없어요. SQLite가 내부적으로 sqlite_schema 테이블을 어떻게 사용하는지에 대한 추가 정보는 파일 형식 문서의 스키마 저장 소절을 참조하세요.

대체 이름 (Alternative Names)

스키마 테이블은 항상 "sqlite_schema"라는 이름으로 참조할 수 있어요. 특히 "main.sqlite_schema"나 "temp.sqlite_schema"처럼 스키마 이름으로 한정하면 더 확실해요. 하지만 역사적 호환성을 위해 몇 가지 대체 이름도 인식돼요.

  1. sqlite_master
  2. sqlite_temp_schema
  3. sqlite_temp_master

대체 이름 (2)와 (3)은 각 데이터베이스 연결에 연결된 TEMP 데이터베이스에서만 동작하지만, 대체 이름 (1)은 어디서나 동작해요. 역사적인 이유로 sqlite3_set_authorizer() 인터페이스의 콜백은 항상 이름 (1)이나 (3)으로 스키마 테이블을 참조해요.

스키마 테이블 해석 (Interpretation Of The Schema Table)

스키마 테이블 필드의 의미는 다음과 같아요.

type

sqlite_schema.type 열은 정의된 객체의 유형에 따라 'table', 'index', 'view', 'trigger' 중 하나의 텍스트 문자열이 돼요. 'table' 문자열은 일반 테이블과 가상 테이블 모두에 사용돼요.

name

sqlite_schema.name 열은 객체의 이름을 담아요. 테이블의 UNIQUEPRIMARY KEY 제약 조건은 SQLite로 하여금 "sqlite_autoindex_TABLE_N" 형태의 내부 인덱스를 만들게 해요. 여기서 TABLE은 제약 조건을 담고 있는 테이블 이름으로, N은 1부터 시작해 테이블 정의에서 보이는 각 제약 조건마다 1씩 증가하는 정수로 대체돼요. WITHOUT ROWID 테이블에서는 PRIMARY KEY에 대한 sqlite_schema 항목이 없지만, sqlite_schema 항목이 존재하는 것처럼 PRIMARY KEY를 위해 "sqlite_autoindex_TABLE_N" 이름이 따로 마련돼요. 이는 이후 UNIQUE 제약 조건의 번호 매기기에 영향을 줄 수 있어요. "sqlite_autoindex_TABLE_N" 이름은 rowid 테이블과 WITHOUT ROWID 테이블 모두에서 INTEGER PRIMARY KEY에는 결코 할당되지 않아요.

tbl_name

sqlite_schema.tbl_name 열은 객체가 연관된 테이블이나 뷰의 이름을 담아요. 테이블이나 뷰의 경우 tbl_name 열은 name 열의 복사본이에요. 인덱스의 경우 tbl_name은 인덱싱되는 테이블의 이름이에요. 트리거의 경우 tbl_name 열은 트리거가 발동되게 하는 테이블이나 뷰의 이름을 저장해요.

rootpage

sqlite_schema.rootpage 열은 테이블과 인덱스의 루트 b-tree 페이지 번호를 저장해요. 뷰, 트리거, 가상 테이블을 정의하는 행의 경우 rootpage 열은 0 또는 NULL이에요.

sql

sqlite_schema.sql 열은 객체를 설명하는 SQL 텍스트를 저장해요. 이 SQL 텍스트는 CREATE TABLE, CREATE VIRTUAL TABLE, CREATE INDEX, CREATE VIEW, 또는 CREATE TRIGGER 문으로, 이 문이 데이터베이스 파일을 데이터베이스 연결의 메인 데이터베이스로 평가하면 그 객체를 다시 생성할 수 있어요. 텍스트는 보통 객체를 만드는 데 사용된 원래 문장의 복사본이지만, 다음 규칙을 따르도록 정규화가 적용돼요.

  • 문장 시작 부분의 CREATE, TABLE, VIEW, TRIGGER, INDEX 키워드는 모두 대문자로 변환돼요.
  • 처음 CREATE 키워드 다음에 오면 TEMP 또는 TEMPORARY 키워드는 제거돼요.
  • 생성되는 객체 이름 앞에 오는 데이터베이스 이름 한정자는 제거돼요.
  • 앞부분 공백은 제거돼요.
  • 처음 두 키워드 다음의 모든 공백은 하나의 공백으로 변환돼요.

sqlite_schema.sql 열의 텍스트는 객체를 만든 원래 CREATE 문장 텍스트의 복사본이지만, 위에서 설명한 대로 정규화되고 이후 ALTER TABLE 문에 의해 수정된 것이에요. sqlite_schema.sql은 UNIQUEPRIMARY KEY 제약 조건에 의해 자동으로 생성되는 내부 인덱스에는 NULL이에요.

스키마 테이블의 생성과 수정 (Creation and Modification Of The Schema Table)

SQLite는 데이터베이스 생성 시 스키마 테이블을 만들고, 사용자가 실행할 DDL 문장을 제출함에 따라 그 내용을 수정해요. 정상적인 상황에서 사용자가 이를 수정할 필요는 없으며, 만약 수정한다면 데이터베이스 손상의 위험을 감수하게 돼요.

더 알아보기 (Learn more)