Модератор: Модераторы
sts писал(а):нужно делать версионирование данных.
xchgeaxeax писал(а):Достаточно
sts писал(а):это самый примитивный уровень, не всегда достаточный для обеспечения целостности данных
xchgeaxeax писал(а):Ну, например, когда это вам не даст сохранить целостность при выполнении условия последовательной записи?
xchgeaxeax писал(а):Так при удалении у вас не добавляется новая строка, а лишь изменяется isDeleted на true, а в выборке вы просто добавляете еще одно условие AND (NOT isDeleted). Таким образом у вас либо будет запись, либо её не будет. И соответственно дальше по связям.
sts писал(а):нужно делать версионирование данных.
sts писал(а):нужно делать версионирование данных.
Sharfik писал(а): И тут тонкая грань, либо с дуру переименуют объект "ведущий инженер" на "суперведущий инженер", либо перекинут юзера из одного объекта в другой. Если переименуют, тогда ж...а. При просмотре работ выполненных в прошлом будет светится что их делал СуперВедущий, а не Ведущий.
Sharfik писал(а):в январе 20 года сотрудник "ведущий инженер" делает работу.
sts писал(а):а пример, на примере должности это просто пример или решается задача учета кадров?, просто в кадрах еще в бумажные времена решили проблему версионирования, т.е. можно просто реализовать как положено
xchgeaxeax писал(а):Даже звучит жутко...
---------------------------------
pers_t
pers_id pers_fio
1 иванова
2 сидоров
---------------------------------
doc_t
doc_id write_date
1 01.01.2024
---------------------------------
doc_sp_t
pos_id doc_id pers_id
1 1 1
2 1 2
---------------------------------
---------------------------------
pers_t
pers_id pers_fio
1 петрова
2 сидоров
3 петров
---------------------------------
doc_t
doc_id write_date
1 01.01.2024
2 01.01.2025
---------------------------------
doc_sp_t
pos_id doc_id pers_id
1 1 1
2 1 2
3 2 1
4 2 2
5 2 3
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, sp.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.doc_id = d.doc_id INNER JOIN pers_t p ON p.pers_id = sp.pers_id
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 петрова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
/*
DROP TABLE doc_sp_t
/
DROP TABLE doc_t
/
DROP TABLE pers_t
/
*/
CREATE TABLE pers_t (
pers_id NUMBER PRIMARY KEY,
pers_fio VARCHAR2(1000) NOT NULL
)
/
CREATE TABLE doc_t (
doc_id NUMBER PRIMARY KEY,
write_date DATE NOT NULL
)
/
CREATE TABLE doc_sp_t (
pos_id NUMBER PRIMARY KEY,
doc_id NUMBER NOT NULL REFERENCES doc_t (doc_id),
pers_id NUMBER NOT NULL REFERENCES pers_t (pers_id)
)
/
/*
DELETE FROM doc_sp_t
/
DELETE FROM doc_t
/
DELETE FROM pers_t
/
*/
INSERT INTO pers_t (pers_id, pers_fio)
VALUES (1, 'иванова')
/
INSERT INTO doc_t (doc_id, write_date)
VALUES (1, '01.01.2024')
/
INSERT INTO doc_sp_t (pos_id, doc_id, pers_id)
VALUES (1, 1, 1)
/
INSERT INTO pers_t (pers_id, pers_fio)
VALUES (2, 'сидоров')
/
INSERT INTO doc_sp_t (pos_id, doc_id, pers_id)
VALUES (2, 1, 2)
/
---------------------------------
pers_t
pers_id pers_fio
1 иванова
2 сидоров
---------------------------------
doc_t
doc_id write_date
1 01.01.2024
---------------------------------
doc_sp_t
pos_id doc_id pers_id
1 1 1
2 1 2
---------------------------------
INSERT INTO pers_t (pers_id, pers_fio)
VALUES (3, 'петров')
/
INSERT INTO doc_t (doc_id, write_date)
VALUES (2, '01.01.2025')
/
INSERT INTO doc_sp_t (pos_id, doc_id, pers_id)
VALUES (3, 2, 1)
/
INSERT INTO doc_sp_t (pos_id, doc_id, pers_id)
VALUES (4, 2, 2)
/
INSERT INTO doc_sp_t (pos_id, doc_id, pers_id)
VALUES (5, 2, 3)
/
UPDATE pers_t SET pers_fio = 'петрова' WHERE pers_id = 1
/
---------------------------------
pers_t
pers_id pers_fio
1 петрова
2 сидоров
3 петров
---------------------------------
doc_t
doc_id write_date
1 01.01.2024
2 01.01.2025
---------------------------------
doc_sp_t
pos_id doc_id pers_id
1 1 1
2 1 2
3 2 1
4 2 2
5 2 3
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, sp.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.doc_id = d.doc_id INNER JOIN pers_t p ON p.pers_id = sp.pers_id
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 петрова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
pers_t
vpers_id beg_id end_id pers_id pers_fio
1 1 3(4 п4) 1 иванова
2 2 ? 2 сидоров
3 3 ? 3 петров
4 4 ? 1 петрова
rev_t
rev_id
1
2
3
4
---------------------------------
pers_t
vpers_id beg_id end_id pers_id pers_fio
1 1 4 1 иванова
2 2 ? 2 сидоров
3 3 ? 3 петров
4 4 ? 1 петрова
---------------------------------
doc_t
vdoc_id beg_id end_id doc_id write_date
1 1 ? 1 01.01.2024
2 3 ? 2 01.01.2025
---------------------------------
doc_sp_t
vpos_id beg_id end_id pos_id vdoc_id vpers_id
1 1 ? 1 1 1
2 2 ? 2 1 2
3 3 4 3 2 1
4 3 ? 4 2 2
5 3 ? 5 2 3
6 4 ? 3 2 4
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 4
AND r.rev_id >= d.beg_id AND r.rev_id < COALESCE(d.end_id, r.rev_id +1)
AND r.rev_id >= sp.beg_id AND r.rev_id < COALESCE(sp.end_id, r.rev_id +1)
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
/*
DROP TABLE doc_sp_t
/
DROP TABLE doc_t
/
DROP TABLE pers_t
/
DROP TABLE rev_t
/
*/
CREATE TABLE rev_t (
rev_id NUMBER PRIMARY KEY
)
/
CREATE TABLE pers_t (
vpers_id NUMBER PRIMARY KEY,
beg_id NUMBER NOT NULL REFERENCES rev_t (rev_id),
end_id NUMBER REFERENCES rev_t (rev_id),
pers_id NUMBER NOT NULL,
pers_fio VARCHAR2(1000) NOT NULL
)
/
CREATE INDEX ix_pers_t ON pers_t (beg_id, end_id, pers_id)
/
CREATE TABLE doc_t (
vdoc_id NUMBER PRIMARY KEY,
beg_id NUMBER NOT NULL REFERENCES rev_t (rev_id),
end_id NUMBER REFERENCES rev_t (rev_id),
doc_id NUMBER NOT NULL,
write_date DATE NOT NULL
)
/
CREATE INDEX ix_doc_t ON doc_t (beg_id, end_id, doc_id)
/
CREATE TABLE doc_sp_t (
vpos_id NUMBER PRIMARY KEY,
beg_id NUMBER NOT NULL REFERENCES rev_t (rev_id),
end_id NUMBER REFERENCES rev_t (rev_id),
pos_id NUMBER NOT NULL,
vdoc_id NUMBER NOT NULL REFERENCES doc_t (vdoc_id),
vpers_id NUMBER NOT NULL REFERENCES pers_t (vpers_id)
)
/
CREATE INDEX ix_doc_sp_t ON doc_sp_t (beg_id, end_id, pos_id)
/
/*
DELETE FROM doc_sp_t
/
DELETE FROM doc_t
/
DELETE FROM pers_t
/
DELETE FROM rev_t
/
*/
INSERT INTO rev_t (rev_id)
VALUES (1)
/
INSERT INTO pers_t (vpers_id, beg_id, end_id, pers_id, pers_fio)
VALUES (1, 1, null, 1, 'иванова')
/
INSERT INTO doc_t (vdoc_id, beg_id, end_id, doc_id, write_date)
VALUES (1, 1, null, 1, '01.01.2024')
/
INSERT INTO doc_sp_t (vpos_id, beg_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (1, 1, null, 1, 1, 1)
/
INSERT INTO rev_t (rev_id)
VALUES (2)
/
INSERT INTO pers_t (vpers_id, beg_id, end_id, pers_id, pers_fio)
VALUES (2, 2, null, 2, 'сидоров')
/
INSERT INTO doc_sp_t (vpos_id, beg_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (2, 2, null, 2, 1, 2)
/
---------------------------------
rev_t
rev_id
1
2
---------------------------------
pers_t
vpers_id beg_id end_id pers_id pers_fio
1 1 ? 1 иванова
2 2 ? 2 сидоров
---------------------------------
doc_t
vdoc_id beg_id end_id doc_id write_date
1 1 ? 1 01.01.2024
---------------------------------
doc_sp_t
vpos_id beg_id end_id pos_id vdoc_id vpers_id
1 1 ? 1 1 1
2 2 ? 2 1 2
---------------------------------
INSERT INTO rev_t (rev_id)
VALUES (3)
/
INSERT INTO pers_t (vpers_id, beg_id, end_id, pers_id, pers_fio)
VALUES (3, 3, null, 3, 'петров')
/
INSERT INTO doc_t (vdoc_id, beg_id, end_id, doc_id, write_date)
VALUES (2, 3, null, 2, '01.01.2025')
/
INSERT INTO doc_sp_t (vpos_id, beg_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (3, 3, null, 3, 2, 1)
/
INSERT INTO doc_sp_t (vpos_id, beg_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (4, 3, null, 4, 2, 2)
/
INSERT INTO doc_sp_t (vpos_id, beg_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (5, 3, null, 5, 2, 3)
/
INSERT INTO rev_t (rev_id)
VALUES (4)
/
INSERT INTO pers_t (vpers_id, beg_id, end_id, pers_id, pers_fio)
VALUES (4, 4, null, 1, 'петрова')
/
UPDATE pers_t SET end_id = 4 WHERE vpers_id = 1
/
INSERT INTO doc_sp_t (vpos_id, beg_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (6, 4, null, 3, 2, 4)
/
UPDATE doc_sp_t SET end_id = 4 WHERE vpos_id = 3
/
---------------------------------
rev_t
rev_id
1
2
3
4
---------------------------------
pers_t
vpers_id beg_id end_id pers_id pers_fio
1 1 4 1 иванова
2 2 ? 2 сидоров
3 3 ? 3 петров
4 4 ? 1 петрова
---------------------------------
doc_t
vdoc_id beg_id end_id doc_id write_date
1 1 ? 1 01.01.2024
2 3 ? 2 01.01.2025
---------------------------------
doc_sp_t
vpos_id beg_id end_id pos_id vdoc_id vpers_id
1 1 ? 1 1 1
2 2 ? 2 1 2
3 3 4 3 2 1
4 3 ? 4 2 2
5 3 ? 5 2 3
6 4 ? 3 2 4
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 иванова
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 4
AND r.rev_id >= d.beg_id AND r.rev_id < COALESCE(d.end_id, r.rev_id +1)
AND r.rev_id >= sp.beg_id AND r.rev_id < COALESCE(sp.end_id, r.rev_id +1)
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 3
AND r.rev_id >= d.beg_id AND r.rev_id < COALESCE(d.end_id, r.rev_id +1)
AND r.rev_id >= sp.beg_id AND r.rev_id < COALESCE(sp.end_id, r.rev_id +1)
AND d.doc_id = 2
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
2 01.01.2025 3 1 иванова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
/*
DROP TABLE doc_sp_t
/
DROP TABLE doc_t
/
DROP TABLE pers_t
/
DROP TABLE ver_t
/
DROP TABLE rev_t
/
*/
CREATE TABLE rev_t (
rev_id NUMBER PRIMARY KEY,
ver_id NUMBER
)
/
CREATE INDEX ix_rev_t ON rev_t (rev_id, ver_id)
/
CREATE TABLE ver_t (
ver_id NUMBER PRIMARY KEY,
rev_id NUMBER REFERENCES rev_t (rev_id)
)
/
CREATE TABLE pers_t (
vpers_id NUMBER PRIMARY KEY REFERENCES ver_t (ver_id),
end_id NUMBER REFERENCES ver_t (ver_id),
pers_id NUMBER NOT NULL,
pers_fio VARCHAR2(1000) NOT NULL
)
/
CREATE INDEX ix_pers_t ON pers_t (vpers_id, end_id, pers_id)
/
CREATE TABLE doc_t (
vdoc_id NUMBER PRIMARY KEY REFERENCES ver_t (ver_id),
end_id NUMBER REFERENCES ver_t (ver_id),
doc_id NUMBER NOT NULL,
write_date DATE NOT NULL
)
/
CREATE INDEX ix_doc_t ON doc_t (vdoc_id, end_id, doc_id)
/
CREATE TABLE doc_sp_t (
vpos_id NUMBER PRIMARY KEY REFERENCES ver_t (ver_id),
end_id NUMBER REFERENCES ver_t (ver_id),
pos_id NUMBER NOT NULL,
vdoc_id NUMBER NOT NULL REFERENCES doc_t (vdoc_id),
vpers_id NUMBER NOT NULL REFERENCES pers_t (vpers_id)
)
/
CREATE INDEX ix_doc_sp_t ON doc_sp_t (vpos_id, end_id, pos_id)
/
/*
DELETE FROM doc_sp_t
/
DELETE FROM doc_t
/
DELETE FROM pers_t
/
DELETE FROM ver_t
/
DELETE FROM rev_t
/
*/
INSERT INTO rev_t (rev_id)
VALUES (1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (1, 1)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (1, null, 1, 'иванова')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (2, 1)
/
INSERT INTO doc_t (vdoc_id, end_id, doc_id, write_date)
VALUES (2, null, 1, '01.01.2024')
/
INSERT INTO rev_t (rev_id)
VALUES (2)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (3, 2)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (3, null, 1, 2, 1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (4, 2)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (4, null, 2, 'сидоров')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (5, 2)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (5, null, 2, 2, 4)
/
---------------------------------
rev_t
rev_id
1
2
---------------------------------
pers_t
vpers_id end_id pers_id pers_fio
1 ? 1 иванова
4 ? 2 сидоров
---------------------------------
doc_t
vdoc_id end_id doc_id write_date
2 ? 1 01.01.2024
---------------------------------
doc_sp_t
vpos_id end_id pos_id vdoc_id vpers_id
3 ? 1 2 1
5 ? 2 2 4
---------------------------------
INSERT INTO rev_t (rev_id)
VALUES (3)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (6, 3)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (6, null, 3, 'петров')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (7, 3)
/
INSERT INTO doc_t (vdoc_id, end_id, doc_id, write_date)
VALUES (7, null, 2, '01.01.2025')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (8, 3)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (8, null, 3, 7, 1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (9, 3)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (9, null, 4, 7, 4)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (10, 3)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (10, null, 5, 7, 6)
/
UPDATE rev_t SET ver_id = 10 WHERE rev_id = 3
/
INSERT INTO rev_t (rev_id)
VALUES (4)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (11, 4)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (11, null, 1, 'петрова')
/
UPDATE pers_t SET end_id = 11 WHERE vpers_id = 1
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (12, 4)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (12, null, 3, 7, 11)
/
UPDATE doc_sp_t SET end_id = 12 WHERE vpos_id = 8
/
UPDATE rev_t SET ver_id = 12 WHERE rev_id = 4
/
---------------------------------
rev_t
rev_id
1
2
3
4
---------------------------------
pers_t
vpers_id end_id pers_id pers_fio
1 11 1 иванова
4 ? 2 сидоров
6 ? 3 петров
11 ? 1 петрова
---------------------------------
doc_t
vdoc_id end_id doc_id write_date
2 ? 1 01.01.2024
7 ? 2 01.01.2025
---------------------------------
doc_sp_t
vpos_id end_id pos_id vdoc_id vpers_id
3 ? 1 2 1
5 ? 2 2 4
8 12 3 7 1
9 ? 4 7 4
10 ? 5 7 6
12 ? 3 7 11
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 иванова
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 4
AND r.ver_id >= d.vdoc_id AND r.ver_id < COALESCE(d.end_id, r.ver_id +1)
AND r.ver_id >= sp.vpos_id AND r.ver_id < COALESCE(sp.end_id, r.ver_id +1)
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 3
AND r.ver_id >= d.vdoc_id AND r.ver_id < COALESCE(d.end_id, r.ver_id +1)
AND r.ver_id >= sp.vpos_id AND r.ver_id < COALESCE(sp.end_id, r.ver_id +1)
AND d.doc_id = 2
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
2 01.01.2025 3 1 иванова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
/*
DROP TABLE doc_sp_t
/
DROP TABLE doc_t
/
DROP TABLE pers_t
/
DROP TABLE ver_t
/
DROP TABLE rev_t
/
*/
CREATE TABLE rev_t (
rev_id NUMBER PRIMARY KEY,
ver_id NUMBER
)
/
CREATE INDEX ix_rev_t ON rev_t (rev_id, ver_id)
/
CREATE TABLE ver_t (
ver_id NUMBER PRIMARY KEY,
rev_id NUMBER REFERENCES rev_t (rev_id)
)
/
CREATE TABLE pers_t (
vpers_id NUMBER PRIMARY KEY REFERENCES ver_t (ver_id),
end_id NUMBER NOT NULL REFERENCES ver_t (ver_id),
pers_id NUMBER NOT NULL,
pers_fio VARCHAR2(1000) NOT NULL
)
/
CREATE INDEX ix_pers_t ON pers_t (vpers_id, end_id, pers_id)
/
CREATE TABLE doc_t (
vdoc_id NUMBER PRIMARY KEY REFERENCES ver_t (ver_id),
end_id NUMBER NOT NULL REFERENCES ver_t (ver_id),
doc_id NUMBER NOT NULL,
write_date DATE NOT NULL
)
/
CREATE INDEX ix_doc_t ON doc_t (vdoc_id, end_id, doc_id)
/
CREATE TABLE doc_sp_t (
vpos_id NUMBER PRIMARY KEY REFERENCES ver_t (ver_id),
end_id NUMBER NOT NULL REFERENCES ver_t (ver_id),
pos_id NUMBER NOT NULL,
vdoc_id NUMBER NOT NULL REFERENCES doc_t (vdoc_id),
vpers_id NUMBER NOT NULL REFERENCES pers_t (vpers_id)
)
/
CREATE INDEX ix_doc_sp_t ON doc_sp_t (vpos_id, end_id, pos_id)
/
/*
DELETE FROM doc_sp_t
/
DELETE FROM doc_t
/
DELETE FROM pers_t
/
DELETE FROM ver_t
/
DELETE FROM rev_t
/
*/
INSERT INTO rev_t (rev_id)
VALUES (1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (999, 1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (1, 1)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (1, 999, 1, 'иванова')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (2, 1)
/
INSERT INTO doc_t (vdoc_id, end_id, doc_id, write_date)
VALUES (2, 999, 1, '01.01.2024')
/
UPDATE rev_t SET ver_id = 2 WHERE rev_id = 1
/
INSERT INTO rev_t (rev_id)
VALUES (2)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (3, 2)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (3, 999, 1, 2, 1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (4, 2)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (4, 999, 2, 'сидоров')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (5, 2)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (5, 999, 2, 2, 4)
/
UPDATE rev_t SET ver_id = 5 WHERE rev_id = 2
/
---------------------------------
rev_t
rev_id
1
2
---------------------------------
pers_t
vpers_id end_id pers_id pers_fio
1 999 1 иванова
4 999 2 сидоров
---------------------------------
doc_t
vdoc_id end_id doc_id write_date
2 999 1 01.01.2024
---------------------------------
doc_sp_t
vpos_id end_id pos_id vdoc_id vpers_id
3 999 1 2 1
5 999 2 2 4
---------------------------------
INSERT INTO rev_t (rev_id)
VALUES (3)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (6, 3)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (6, 999, 3, 'петров')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (7, 3)
/
INSERT INTO doc_t (vdoc_id, end_id, doc_id, write_date)
VALUES (7, 999, 2, '01.01.2025')
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (8, 3)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (8, 999, 3, 7, 1)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (9, 3)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (9, 999, 4, 7, 4)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (10, 3)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (10, 999, 5, 7, 6)
/
UPDATE rev_t SET ver_id = 10 WHERE rev_id = 3
/
INSERT INTO rev_t (rev_id)
VALUES (4)
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (11, 4)
/
INSERT INTO pers_t (vpers_id, end_id, pers_id, pers_fio)
VALUES (11, 999, 1, 'петрова')
/
UPDATE pers_t SET end_id = 10 WHERE vpers_id = 1
/
INSERT INTO ver_t (ver_id, rev_id)
VALUES (12, 4)
/
INSERT INTO doc_sp_t (vpos_id, end_id, pos_id, vdoc_id, vpers_id)
VALUES (12, 999, 3, 7, 11)
/
UPDATE doc_sp_t SET end_id = 11 WHERE vpos_id = 8
/
UPDATE rev_t SET ver_id = 12 WHERE rev_id = 4
/
---------------------------------
rev_t
rev_id
1
2
3
4
---------------------------------
pers_t
vpers_id end_id pers_id pers_fio
1 10 1 иванова
4 999 2 сидоров
6 999 3 петров
11 999 1 петрова
---------------------------------
doc_t
vdoc_id end_id doc_id write_date
2 999 1 01.01.2024
7 999 2 01.01.2025
---------------------------------
doc_sp_t
vpos_id end_id pos_id vdoc_id vpers_id
3 999 1 2 1
5 999 2 2 4
8 11 3 7 1
9 999 4 7 4
10 999 5 7 6
12 999 3 7 11
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 иванова
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 4
AND r.ver_id BETWEEN d.vdoc_id AND d.end_id
AND r.ver_id BETWEEN sp.vpos_id AND sp.end_id
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
1 01.01.2024 1 1 иванова
1 01.01.2024 2 2 сидоров
2 01.01.2025 3 1 петрова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
SELECT d.doc_id, d.write_date, sp.pos_id, p.pers_id, p.pers_fio FROM doc_t d INNER JOIN doc_sp_t sp ON sp.vdoc_id = d.vdoc_id INNER JOIN pers_t p ON p.vpers_id = sp.vpers_id, rev_t r
WHERE r.rev_id = 3
AND r.ver_id BETWEEN d.vdoc_id AND d.end_id
AND r.ver_id BETWEEN sp.vpos_id AND sp.end_id
AND d.doc_id = 2
ORDER BY d.doc_id, sp.pos_id
doc_id write_date pos_id pers_id pers_fio
2 01.01.2025 3 1 иванова
2 01.01.2025 4 2 сидоров
2 01.01.2025 5 3 петров
---------------------------------
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0