pki_ca/create_tables.sql

63 lines
1.7 KiB
SQL

-- ------------------------
-- Metadata table (singleton)
-- ------------------------
DROP TABLE IF EXISTS metadata;
CREATE TABLE metadata (
name VARCHAR(50),
comment VARCHAR(200),
private_key VARCHAR(500),
public_key VARCHAR(500)
);
INSERT INTO metadata DEFAULT VALUES;
-- ------------------------
-- Entity table
-- ------------------------
DROP TABLE IF EXISTS entity CASCADE;
CREATE TABLE entity (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
creation_ts TIMESTAMPTZ NOT NULL DEFAULT now(),
creator INT REFERENCES entity(id),
name VARCHAR(100) NOT NULL,
type VARCHAR(10) NOT NULL DEFAULT 'person', -- 'creator', 'person', 'group', 'device'
geo_offset BIGINT,
public_key VARCHAR(300) NOT NULL,
expiration DATE,
status VARCHAR(10) NOT NULL DEFAULT 'active'
);
-- Indexes
CREATE INDEX idx_entity_name ON entity(name);
CREATE INDEX idx_entity_expiration ON entity(expiration);
ALTER TABLE entity ADD CONSTRAINT entity_name_unique UNIQUE (name);
-- ------------------------
-- Group Member table
-- ------------------------
DROP TABLE IF EXISTS group_member;
CREATE TABLE group_member (
group_id INT NOT NULL REFERENCES entity(id) ON DELETE CASCADE,
member_id INT NOT NULL REFERENCES entity(id) ON DELETE CASCADE,
role VARCHAR(10),
PRIMARY KEY (group_id, member_id)
);
CREATE INDEX idx_group_member_member_group ON group_member(member_id, group_id);
-- ------------------------
-- Property table
-- ------------------------
DROP TABLE IF EXISTS property;
CREATE TABLE property (
id INT NOT NULL REFERENCES entity(id) ON DELETE CASCADE,
property_name VARCHAR(100),
PRIMARY KEY (id, property_name)
);