-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path008_master_code_format.sql
More file actions
383 lines (370 loc) · 19.5 KB
/
Copy path008_master_code_format.sql
File metadata and controls
383 lines (370 loc) · 19.5 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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
-- 008 マスタのコードの書式(docs/12 §2-1・ADR-0047)
--
-- コードを持つ 6 つの表すべてに、同じ規則を当てる。
-- 半角英数字とハイフン・アンダーバーだけ。記号は先頭・末尾に置けず、連続もできない。長さは 1〜20。
-- 断りの文言(条件ごと・順・呼び名・調)の規則は docs/12 §2-1。
--
-- **CHECK ではなくトリガで書く。** CHECK を後から足すには表を作り直すしかなく、
-- accounts は journal_lines から参照され、既にトリガも持っているので、作り直しは危険に見合わない。
-- トリガなら追加で配れる(005 のマスタの守りと同じ形)。
--
-- **この 1 ファイルにまとめる理由は、トリガの作られる順である。** 004 の末尾に足すと、
-- 既存 DB へ配る側(migrations)では 005 のトリガより後に作られ、正典と順が食い違う。
-- 同値テストは表ごとのトリガの作られた順まで見る(MigrationEquivalenceTests)。
--
-- **前後の空白を落とすのは関門(C# の MasterCode)の仕事**である。ここへ来る値は落とした後の姿で、
-- 空白が残っていれば「使えない字」として断る——字種の GLOB がすべての空白を拾う。
--
-- **文言は条件ごとに 1 つ。順・呼び名・調は docs/12 §2-1 が持つ**(ここに写さない。2026-09-10)。
-- WHEN 節は 1 本の式のまま——`MasterCodeGuardTests` が規則の写しを持たずに WHEN 節を読み、
-- 本文の条件の OR と同値であることも確かめる。
--
-- **最後の 2 つは、GLOB が読めない値のためにある。**
--
-- **BLOB は TEXT の列にそのまま入る**(STRICT ではないので affinity が効かない。
-- 数値は text へ変換されるが、BLOB だけは BLOB のまま残る。2026-09-09 に実測)。
-- **BLOB の `x'4142'` と TEXT の `'AB'` は別の値**なので、COLLATE NOCASE の一意索引でも
-- ぶつからず、**見た目が同じ 2 行が並ぶ**——[qa/03 L-32](../../docs/qa/03_テストで漏らした実例.md) を
-- 別の入口から開け直すことになる。しかも GLOB は BLOB に対して「使える字」と答える。
-- **`typeof` で断る**(NULL は列の NOT NULL が「入れてください」の側で断るので、ここでは見ない)。
--
-- **NUL の条件は、値が TEXT であることを前提にしている。** SQLite の LENGTH と GLOB は文字列の途中の U+0000 で止まるので、
-- 'A' || char(0) || 'B' のような値は上の 6 条件を全部すり抜ける(2026-09-09 に実測。3.53.1)。
-- **値が TEXT なら**バイト数(BLOB へ写した長さ)と文字数が食い違えば ASCII でない——半角英数だけを通す規則と同じことを、
-- GLOB が読めない領域まで含めて言い直している。**関門は U+0000 を「目に見えない文字」として断る**ので、
-- ここが効くのは取込・CLI・SQL の直打ちだけである(それがこのトリガの持ち場でもある)。
--
-- 大小を無視した重複は、末尾の一意索引が止める。COLLATE NOCASE が畳むのは ASCII の英字だけだが、
-- 字種を半角英数に絞ってあるので過不足なく噛み合う。
CREATE TRIGGER trg_fiscal_years_code_format_insert
BEFORE INSERT ON fiscal_years
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「年度コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「年度コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「年度コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「年度コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「年度コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「年度コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_fiscal_years_code_format_update
BEFORE UPDATE OF code ON fiscal_years
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「年度コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「年度コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「年度コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「年度コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「年度コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「年度コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_tax_categories_code_format_insert
BEFORE INSERT ON tax_categories
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「税区分コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「税区分コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「税区分コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「税区分コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「税区分コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「税区分コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_tax_categories_code_format_update
BEFORE UPDATE OF code ON tax_categories
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「税区分コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「税区分コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「税区分コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「税区分コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「税区分コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「税区分コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_accounts_code_format_insert
BEFORE INSERT ON accounts
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「科目コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「科目コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「科目コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「科目コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「科目コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「科目コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_accounts_code_format_update
BEFORE UPDATE OF code ON accounts
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「科目コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「科目コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「科目コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「科目コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「科目コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「科目コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_sub_accounts_code_format_insert
BEFORE INSERT ON sub_accounts
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「補助科目コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「補助科目コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「補助科目コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「補助科目コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「補助科目コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「補助科目コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_sub_accounts_code_format_update
BEFORE UPDATE OF code ON sub_accounts
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「補助科目コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「補助科目コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「補助科目コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「補助科目コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「補助科目コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「補助科目コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_departments_code_format_insert
BEFORE INSERT ON departments
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「部門コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「部門コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「部門コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「部門コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「部門コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「部門コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_departments_code_format_update
BEFORE UPDATE OF code ON departments
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「部門コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「部門コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「部門コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「部門コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「部門コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「部門コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_partners_code_format_insert
BEFORE INSERT ON partners
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「取引先コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「取引先コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「取引先コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「取引先コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「取引先コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「取引先コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
CREATE TRIGGER trg_partners_code_format_update
BEFORE UPDATE OF code ON partners
FOR EACH ROW
WHEN NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR NEW.code GLOB '[-_]*'
OR NEW.code GLOB '*[-_]'
OR NEW.code GLOB '*[-_][-_]*'
OR LENGTH(NEW.code) < 1
OR LENGTH(NEW.code) > 20
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code)
OR typeof(NEW.code) = 'blob'
BEGIN
SELECT RAISE(ABORT, '「取引先コード」が空である。')
WHERE typeof(NEW.code) <> 'blob' AND LENGTH(NEW.code) < 1;
SELECT RAISE(ABORT, '「取引先コード」に使えない字が入っている。半角の英数字と「-」「_」だけを使う。')
WHERE typeof(NEW.code) = 'blob'
OR NEW.code GLOB '*[^0-9A-Za-z_-]*'
OR LENGTH(CAST(NEW.code AS BLOB)) <> LENGTH(NEW.code);
SELECT RAISE(ABORT, '「取引先コード」の先頭に「-」「_」は置けない。')
WHERE NEW.code GLOB '[-_]*';
SELECT RAISE(ABORT, '「取引先コード」の末尾に「-」「_」は置けない。')
WHERE NEW.code GLOB '*[-_]';
SELECT RAISE(ABORT, '「取引先コード」の「-」「_」は続けて使えない。')
WHERE NEW.code GLOB '*[-_][-_]*';
SELECT RAISE(ABORT, '「取引先コード」は 20 文字以内。')
WHERE LENGTH(NEW.code) > 20;
END;
-- 大小を無視した重複を止める。**保存される字は入力のまま**で、畳むのは判定だけである(ADR-0047 の決定 7)。
-- 列の UNIQUE(バイト列で見る)は残す——外すには表の作り直しが要り、得るのは重複した制約 1 本の削除だけ。
CREATE UNIQUE INDEX ux_fiscal_years_code_nocase ON fiscal_years (code COLLATE NOCASE);
CREATE UNIQUE INDEX ux_tax_categories_code_nocase ON tax_categories (code COLLATE NOCASE);
CREATE UNIQUE INDEX ux_accounts_code_nocase ON accounts (code COLLATE NOCASE);
CREATE UNIQUE INDEX ux_sub_accounts_code_nocase ON sub_accounts (account_id, code COLLATE NOCASE);
CREATE UNIQUE INDEX ux_departments_code_nocase ON departments (code COLLATE NOCASE);
CREATE UNIQUE INDEX ux_partners_code_nocase ON partners (code COLLATE NOCASE);