-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmigrate_add_audit_fields.sql
More file actions
156 lines (136 loc) · 5.1 KB
/
Copy pathmigrate_add_audit_fields.sql
File metadata and controls
156 lines (136 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
-- 为全部业务表和向量表增加统一审计字段与软删除能力。
BEGIN;
DO $$
DECLARE
target_table TEXT;
BEGIN
FOREACH target_table IN ARRAY ARRAY[
't_knowledge_base',
't_knowledge_document',
't_document_chunk'
] LOOP
IF EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = target_table
AND column_name = 'created_at'
) AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = target_table
AND column_name = 'create_time'
) THEN
EXECUTE format(
'ALTER TABLE %I RENAME COLUMN created_at TO create_time',
target_table
);
END IF;
END LOOP;
END
$$;
ALTER TABLE t_knowledge_base
ADD COLUMN IF NOT EXISTS create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS deleted INTEGER NOT NULL DEFAULT 0;
ALTER TABLE t_knowledge_document
ADD COLUMN IF NOT EXISTS create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS deleted INTEGER NOT NULL DEFAULT 0;
ALTER TABLE t_document_chunk
ADD COLUMN IF NOT EXISTS create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS deleted INTEGER NOT NULL DEFAULT 0;
ALTER TABLE t_vector_store
ADD COLUMN IF NOT EXISTS create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS deleted INTEGER NOT NULL DEFAULT 0;
DO $$
DECLARE
target_table TEXT;
constraint_name TEXT;
BEGIN
FOREACH target_table IN ARRAY ARRAY[
't_knowledge_base',
't_knowledge_document',
't_document_chunk',
't_vector_store'
] LOOP
constraint_name := 'chk_' || replace(target_table, 't_', '') || '_deleted';
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = constraint_name
AND conrelid = target_table::regclass
) THEN
EXECUTE format(
'ALTER TABLE %I ADD CONSTRAINT %I CHECK (deleted IN (0, 1))',
target_table,
constraint_name
);
END IF;
END LOOP;
END
$$;
CREATE OR REPLACE FUNCTION set_update_time()
RETURNS TRIGGER AS $$
BEGIN
NEW.update_time = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_knowledge_base_update_time ON t_knowledge_base;
CREATE TRIGGER trg_knowledge_base_update_time
BEFORE UPDATE ON t_knowledge_base
FOR EACH ROW EXECUTE FUNCTION set_update_time();
DROP TRIGGER IF EXISTS trg_knowledge_document_update_time ON t_knowledge_document;
CREATE TRIGGER trg_knowledge_document_update_time
BEFORE UPDATE ON t_knowledge_document
FOR EACH ROW EXECUTE FUNCTION set_update_time();
DROP TRIGGER IF EXISTS trg_document_chunk_update_time ON t_document_chunk;
CREATE TRIGGER trg_document_chunk_update_time
BEFORE UPDATE ON t_document_chunk
FOR EACH ROW EXECUTE FUNCTION set_update_time();
DROP TRIGGER IF EXISTS trg_vector_store_update_time ON t_vector_store;
CREATE TRIGGER trg_vector_store_update_time
BEFORE UPDATE ON t_vector_store
FOR EACH ROW EXECUTE FUNCTION set_update_time();
CREATE OR REPLACE FUNCTION prevent_parent_soft_delete()
RETURNS TRIGGER AS $$
BEGIN
IF OLD.deleted = 0
AND NEW.deleted = 1
AND EXISTS (
SELECT 1
FROM t_knowledge_base child
WHERE child.parent_id = NEW.id
AND child.deleted = 0
) THEN
RAISE EXCEPTION 'Knowledge base with active children cannot be deleted'
USING ERRCODE = '23001';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_prevent_parent_soft_delete ON t_knowledge_base;
CREATE TRIGGER trg_prevent_parent_soft_delete
BEFORE UPDATE OF deleted ON t_knowledge_base
FOR EACH ROW EXECUTE FUNCTION prevent_parent_soft_delete();
DROP INDEX IF EXISTS idx_knowledge_base_parent_id;
CREATE INDEX idx_knowledge_base_parent_id
ON t_knowledge_base (parent_id) WHERE deleted = 0;
DROP INDEX IF EXISTS idx_knowledge_document_base_id;
CREATE INDEX idx_knowledge_document_base_id
ON t_knowledge_document (knowledge_base_id) WHERE deleted = 0;
DROP INDEX IF EXISTS idx_document_chunk_document_id;
CREATE INDEX idx_document_chunk_document_id
ON t_document_chunk (document_id) WHERE deleted = 0;
DROP INDEX IF EXISTS idx_document_chunk_vector_document_id;
CREATE INDEX idx_document_chunk_vector_document_id
ON t_document_chunk (vector_document_id) WHERE deleted = 0;
DROP INDEX IF EXISTS t_vector_store_index;
CREATE INDEX t_vector_store_index
ON t_vector_store USING HNSW (embedding vector_cosine_ops)
WHERE deleted = 0;
COMMIT;