-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path012_text_length.sql
More file actions
595 lines (562 loc) · 26.9 KB
/
Copy path012_text_length.sql
File metadata and controls
595 lines (562 loc) · 26.9 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
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
--------------------------------------------------------------------------------
-- 文字の欄の上限(docs/12 §2-2。2026-09-13 の決着)
--
-- **関門が本体・ここは最後の守り**である(§2-1 のコードと同じ 2 段)。
-- アプリを迂回する経路(CLI・取込・手打ちの SQL)にも効かせるために置く。
--
-- **上限は 3 か所にある**——C# の `MasterTextLength`・このトリガ・デザインのプレースホルダ。
-- **DDL が SQL テキスト、デザインが JSON で、どちらも C# の定数を読めない**ので已むを得ない
-- (docs/20 §4)。**3 者の一致は `FieldLengthConsistencyTests` が毎回突き合わせる。**
--
-- **`LENGTH()` は TEXT なら符号点で数える**(docs/12 §2-2 が「符号点で数える」と決めた形)。
-- **C# の `string.Length` は UTF-16 の符号単位を数える**ので、
-- 𠮟 や 🙂 のような字で 2 になり、**関門が断った値を DDL が通す**——
-- だから C# 側も符号点で数えている(`MasterTextLength.Count`)。
--
-- **数えられない値は 3 通りとも断る。**
-- 1. **BLOB**——`LENGTH()` がバイト数を返すので、短い BLOB は素通りする。
-- 2. **NUL を含む TEXT**——`LENGTH()` は途中の U+0000 で止まるので、後ろはいくらでも隠せる。
-- **`instr(CAST(x AS BLOB), x'00') > 0` で直に探す。**
-- **バイト数と符号点の比では見つからない**——`'A'×30 || NUL || 'B'×60` は
-- 91 バイト・可視 30 符号点で、`4 × 30 = 120` に届かないからである
-- (自己レビューのラウンド 94。2 人が独立に指摘した)。
-- 3. **UTF-8 として壊れた TEXT**——`バイト数 > 4 × 符号点`。
-- 1 符号点は高々 4 バイトなので、超えるなら符号化が壊れている。
--
-- **ALTER TABLE で CHECK は足せない**ので CREATE TRIGGER で配る(008・011 と同じ判断)。
-- **追加と更新の 2 本 1 組。** 更新は `BEFORE UPDATE OF <列>` で、その列を触ったときだけ鳴る
-- ——**上限を決める前から入っていた長い行が、別の欄すら直せなくなる**のを避けるためである。
--
-- **呼び名は画面のラベルと違ってよい。** この文言が届くのは画面を通らない経路の人なので、
-- 「カナ」ではどの表か決まらない(**画面にも DB にも 4 つある**——勘定科目・補助科目・取引先・自社情報)。
--
-- **郵便番号だけは長さではなく書式を見る**(旧 Q-26 の決定。2026-09-16)。
-- 7 桁 + 区切りで 8 文字ちょうどにしかならないので、「N 文字以内」の形が当たらない。
-- **`GLOB` は途中の U+0000 で止まる**ので、書式の手前で NUL・BLOB・壊れた UTF-8 を断る
-- (長さの守りと同じ 3 つ。qa/03 の L-48)。
--
-- **この表に無い文字の欄**については、登録の公表名が docs/12 §2-2-1、
-- 伝票の摘要と明細の内容が docs/10 §4-2-1(数も理由も別である)。
--------------------------------------------------------------------------------
CREATE TRIGGER trg_accounts_name_length_insert
BEFORE INSERT ON accounts
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「科目名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「科目名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_accounts_name_length_update
BEFORE UPDATE OF name ON accounts
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「科目名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「科目名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_sub_accounts_name_length_insert
BEFORE INSERT ON sub_accounts
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「補助科目名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「補助科目名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_sub_accounts_name_length_update
BEFORE UPDATE OF name ON sub_accounts
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「補助科目名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「補助科目名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_departments_name_length_insert
BEFORE INSERT ON departments
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「部門名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「部門名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_departments_name_length_update
BEFORE UPDATE OF name ON departments
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「部門名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「部門名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_tax_categories_name_length_insert
BEFORE INSERT ON tax_categories
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「税区分名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「税区分名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_tax_categories_name_length_update
BEFORE UPDATE OF name ON tax_categories
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 30
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「税区分名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「税区分名」は 30 文字以内。')
WHERE LENGTH(NEW.name) > 30;
END;
CREATE TRIGGER trg_fiscal_years_label_length_insert
BEFORE INSERT ON fiscal_years
FOR EACH ROW
WHEN NEW.label IS NOT NULL
AND (LENGTH(NEW.label) > 30
OR typeof(NEW.label) = 'blob'
OR instr(CAST(NEW.label AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.label AS BLOB)) > 4 * LENGTH(NEW.label))
BEGIN
SELECT RAISE(ABORT, '「年度名」に使えない字が入っている。')
WHERE typeof(NEW.label) = 'blob'
OR instr(CAST(NEW.label AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.label AS BLOB)) > 4 * LENGTH(NEW.label);
SELECT RAISE(ABORT, '「年度名」は 30 文字以内。')
WHERE LENGTH(NEW.label) > 30;
END;
CREATE TRIGGER trg_fiscal_years_label_length_update
BEFORE UPDATE OF label ON fiscal_years
FOR EACH ROW
WHEN NEW.label IS NOT NULL
AND (LENGTH(NEW.label) > 30
OR typeof(NEW.label) = 'blob'
OR instr(CAST(NEW.label AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.label AS BLOB)) > 4 * LENGTH(NEW.label))
BEGIN
SELECT RAISE(ABORT, '「年度名」に使えない字が入っている。')
WHERE typeof(NEW.label) = 'blob'
OR instr(CAST(NEW.label AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.label AS BLOB)) > 4 * LENGTH(NEW.label);
SELECT RAISE(ABORT, '「年度名」は 30 文字以内。')
WHERE LENGTH(NEW.label) > 30;
END;
CREATE TRIGGER trg_partners_name_length_insert
BEFORE INSERT ON partners
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 100
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「取引先名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「取引先名」は 100 文字以内。')
WHERE LENGTH(NEW.name) > 100;
END;
CREATE TRIGGER trg_partners_name_length_update
BEFORE UPDATE OF name ON partners
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 100
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「取引先名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「取引先名」は 100 文字以内。')
WHERE LENGTH(NEW.name) > 100;
END;
CREATE TRIGGER trg_partners_address_length_insert
BEFORE INSERT ON partners
FOR EACH ROW
WHEN NEW.address IS NOT NULL
AND (LENGTH(NEW.address) > 200
OR typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address))
BEGIN
SELECT RAISE(ABORT, '「所在地」に使えない字が入っている。')
WHERE typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address);
SELECT RAISE(ABORT, '「所在地」は 200 文字以内。')
WHERE LENGTH(NEW.address) > 200;
END;
CREATE TRIGGER trg_partners_address_length_update
BEFORE UPDATE OF address ON partners
FOR EACH ROW
WHEN NEW.address IS NOT NULL
AND (LENGTH(NEW.address) > 200
OR typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address))
BEGIN
SELECT RAISE(ABORT, '「所在地」に使えない字が入っている。')
WHERE typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address);
SELECT RAISE(ABORT, '「所在地」は 200 文字以内。')
WHERE LENGTH(NEW.address) > 200;
END;
-- **取引先のカナは、所在地より後に作る。** 2026-09-16 に上限を 100 → 200 へ動かしたとき、
-- マイグレーション(0038)が DROP して作り直したので、**再生した DB では末尾に来る**。
-- **発火順は SQLite の仕様上 undefined** なので、正典の側も同じ順にしておく
-- (`MigrationEquivalenceTests.再生した_DB_はトリガの発火順も正典と同じである`)。
--
-- **既存のトリガを作り直すマイグレーションを書いたら、この形で正典も動かす**——
-- 「新しいトリガは末尾に足す」(`Designer/migrations/README.md`)は**新しいもの**の規則で、
-- **作り直したものは、その表の中で末尾へ移す**。移さないと同値検査が赤くなる。
-- **副作用**: 同じ表の 2 つの上限が同時に超過したとき、**鳴る RAISE が入れ替わる**
-- (実測 3.53 は後に作ったものから鳴る)。どちらが鳴るかを固定した検査は置いていない。
CREATE TRIGGER trg_partners_name_kana_length_insert
BEFORE INSERT ON partners
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 200
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「取引先のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「取引先のカナ」は 200 文字以内。')
WHERE LENGTH(NEW.name_kana) > 200;
END;
CREATE TRIGGER trg_partners_name_kana_length_update
BEFORE UPDATE OF name_kana ON partners
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 200
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「取引先のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「取引先のカナ」は 200 文字以内。')
WHERE LENGTH(NEW.name_kana) > 200;
END;
CREATE TRIGGER trg_accounts_name_kana_length_insert
BEFORE INSERT ON accounts
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 60
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「勘定科目のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「勘定科目のカナ」は 60 文字以内。')
WHERE LENGTH(NEW.name_kana) > 60;
END;
CREATE TRIGGER trg_accounts_name_kana_length_update
BEFORE UPDATE OF name_kana ON accounts
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 60
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「勘定科目のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「勘定科目のカナ」は 60 文字以内。')
WHERE LENGTH(NEW.name_kana) > 60;
END;
CREATE TRIGGER trg_sub_accounts_name_kana_length_insert
BEFORE INSERT ON sub_accounts
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 60
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「補助科目のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「補助科目のカナ」は 60 文字以内。')
WHERE LENGTH(NEW.name_kana) > 60;
END;
CREATE TRIGGER trg_sub_accounts_name_kana_length_update
BEFORE UPDATE OF name_kana ON sub_accounts
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 60
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「補助科目のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「補助科目のカナ」は 60 文字以内。')
WHERE LENGTH(NEW.name_kana) > 60;
END;
CREATE TRIGGER trg_company_profile_name_length_insert
BEFORE INSERT ON company_profile
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 100
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「会社名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「会社名」は 100 文字以内。')
WHERE LENGTH(NEW.name) > 100;
END;
CREATE TRIGGER trg_company_profile_name_length_update
BEFORE UPDATE OF name ON company_profile
FOR EACH ROW
WHEN NEW.name IS NOT NULL
AND (LENGTH(NEW.name) > 100
OR typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name))
BEGIN
SELECT RAISE(ABORT, '「会社名」に使えない字が入っている。')
WHERE typeof(NEW.name) = 'blob'
OR instr(CAST(NEW.name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name AS BLOB)) > 4 * LENGTH(NEW.name);
SELECT RAISE(ABORT, '「会社名」は 100 文字以内。')
WHERE LENGTH(NEW.name) > 100;
END;
CREATE TRIGGER trg_company_profile_name_kana_length_insert
BEFORE INSERT ON company_profile
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 200
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「自社情報のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「自社情報のカナ」は 200 文字以内。')
WHERE LENGTH(NEW.name_kana) > 200;
END;
CREATE TRIGGER trg_company_profile_name_kana_length_update
BEFORE UPDATE OF name_kana ON company_profile
FOR EACH ROW
WHEN NEW.name_kana IS NOT NULL
AND (LENGTH(NEW.name_kana) > 200
OR typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana))
BEGIN
SELECT RAISE(ABORT, '「自社情報のカナ」に使えない字が入っている。')
WHERE typeof(NEW.name_kana) = 'blob'
OR instr(CAST(NEW.name_kana AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.name_kana AS BLOB)) > 4 * LENGTH(NEW.name_kana);
SELECT RAISE(ABORT, '「自社情報のカナ」は 200 文字以内。')
WHERE LENGTH(NEW.name_kana) > 200;
END;
CREATE TRIGGER trg_company_profile_representative_name_length_insert
BEFORE INSERT ON company_profile
FOR EACH ROW
WHEN NEW.representative_name IS NOT NULL
AND (LENGTH(NEW.representative_name) > 30
OR typeof(NEW.representative_name) = 'blob'
OR instr(CAST(NEW.representative_name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.representative_name AS BLOB)) > 4 * LENGTH(NEW.representative_name))
BEGIN
SELECT RAISE(ABORT, '「代表者名」に使えない字が入っている。')
WHERE typeof(NEW.representative_name) = 'blob'
OR instr(CAST(NEW.representative_name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.representative_name AS BLOB)) > 4 * LENGTH(NEW.representative_name);
SELECT RAISE(ABORT, '「代表者名」は 30 文字以内。')
WHERE LENGTH(NEW.representative_name) > 30;
END;
CREATE TRIGGER trg_company_profile_representative_name_length_update
BEFORE UPDATE OF representative_name ON company_profile
FOR EACH ROW
WHEN NEW.representative_name IS NOT NULL
AND (LENGTH(NEW.representative_name) > 30
OR typeof(NEW.representative_name) = 'blob'
OR instr(CAST(NEW.representative_name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.representative_name AS BLOB)) > 4 * LENGTH(NEW.representative_name))
BEGIN
SELECT RAISE(ABORT, '「代表者名」に使えない字が入っている。')
WHERE typeof(NEW.representative_name) = 'blob'
OR instr(CAST(NEW.representative_name AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.representative_name AS BLOB)) > 4 * LENGTH(NEW.representative_name);
SELECT RAISE(ABORT, '「代表者名」は 30 文字以内。')
WHERE LENGTH(NEW.representative_name) > 30;
END;
CREATE TRIGGER trg_company_profile_address_length_insert
BEFORE INSERT ON company_profile
FOR EACH ROW
WHEN NEW.address IS NOT NULL
AND (LENGTH(NEW.address) > 200
OR typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address))
BEGIN
SELECT RAISE(ABORT, '「住所」に使えない字が入っている。')
WHERE typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address);
SELECT RAISE(ABORT, '「住所」は 200 文字以内。')
WHERE LENGTH(NEW.address) > 200;
END;
CREATE TRIGGER trg_company_profile_address_length_update
BEFORE UPDATE OF address ON company_profile
FOR EACH ROW
WHEN NEW.address IS NOT NULL
AND (LENGTH(NEW.address) > 200
OR typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address))
BEGIN
SELECT RAISE(ABORT, '「住所」に使えない字が入っている。')
WHERE typeof(NEW.address) = 'blob'
OR instr(CAST(NEW.address AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.address AS BLOB)) > 4 * LENGTH(NEW.address);
SELECT RAISE(ABORT, '「住所」は 200 文字以内。')
WHERE LENGTH(NEW.address) > 200;
END;
CREATE TRIGGER trg_company_profile_phone_number_length_insert
BEFORE INSERT ON company_profile
FOR EACH ROW
WHEN NEW.phone_number IS NOT NULL
AND (LENGTH(NEW.phone_number) > 20
OR typeof(NEW.phone_number) = 'blob'
OR instr(CAST(NEW.phone_number AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.phone_number AS BLOB)) > 4 * LENGTH(NEW.phone_number))
BEGIN
SELECT RAISE(ABORT, '「電話番号」に使えない字が入っている。')
WHERE typeof(NEW.phone_number) = 'blob'
OR instr(CAST(NEW.phone_number AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.phone_number AS BLOB)) > 4 * LENGTH(NEW.phone_number);
SELECT RAISE(ABORT, '「電話番号」は 20 文字以内。')
WHERE LENGTH(NEW.phone_number) > 20;
END;
CREATE TRIGGER trg_company_profile_phone_number_length_update
BEFORE UPDATE OF phone_number ON company_profile
FOR EACH ROW
WHEN NEW.phone_number IS NOT NULL
AND (LENGTH(NEW.phone_number) > 20
OR typeof(NEW.phone_number) = 'blob'
OR instr(CAST(NEW.phone_number AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.phone_number AS BLOB)) > 4 * LENGTH(NEW.phone_number))
BEGIN
SELECT RAISE(ABORT, '「電話番号」に使えない字が入っている。')
WHERE typeof(NEW.phone_number) = 'blob'
OR instr(CAST(NEW.phone_number AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.phone_number AS BLOB)) > 4 * LENGTH(NEW.phone_number);
SELECT RAISE(ABORT, '「電話番号」は 20 文字以内。')
WHERE LENGTH(NEW.phone_number) > 20;
END;
CREATE TRIGGER trg_company_profile_postal_code_format_insert
BEFORE INSERT ON company_profile
FOR EACH ROW
WHEN NEW.postal_code IS NOT NULL
AND (typeof(NEW.postal_code) = 'blob'
OR instr(CAST(NEW.postal_code AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.postal_code AS BLOB)) > 4 * LENGTH(NEW.postal_code)
OR NEW.postal_code NOT GLOB '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')
BEGIN
SELECT RAISE(ABORT, '「郵便番号」に使えない字が入っている。')
WHERE typeof(NEW.postal_code) = 'blob'
OR instr(CAST(NEW.postal_code AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.postal_code AS BLOB)) > 4 * LENGTH(NEW.postal_code);
SELECT RAISE(ABORT, '「郵便番号」は数字 3 桁 + 「-」 + 数字 4 桁(123-4567)。')
WHERE NEW.postal_code NOT GLOB '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]';
END;
CREATE TRIGGER trg_company_profile_postal_code_format_update
BEFORE UPDATE OF postal_code ON company_profile
FOR EACH ROW
WHEN NEW.postal_code IS NOT NULL
AND (typeof(NEW.postal_code) = 'blob'
OR instr(CAST(NEW.postal_code AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.postal_code AS BLOB)) > 4 * LENGTH(NEW.postal_code)
OR NEW.postal_code NOT GLOB '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')
BEGIN
SELECT RAISE(ABORT, '「郵便番号」に使えない字が入っている。')
WHERE typeof(NEW.postal_code) = 'blob'
OR instr(CAST(NEW.postal_code AS BLOB), x'00') > 0
OR LENGTH(CAST(NEW.postal_code AS BLOB)) > 4 * LENGTH(NEW.postal_code);
SELECT RAISE(ABORT, '「郵便番号」は数字 3 桁 + 「-」 + 数字 4 桁(123-4567)。')
WHERE NEW.postal_code NOT GLOB '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]';
END;