powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Поддержка исправлений и версий
10 сообщений из 10, страница 1 из 1
Поддержка исправлений и версий
    #34631146
Alexsalog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим есть документ (поля, атрибуты, все как положено), заполняемый несколькими пользователями. По части полей идет разделение доступа по ролям. Но, другие доступны для нескольких пользователей... И необходимо соблюсти версионность и историчность. Как в word.

Кс делать лучше?
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34632618
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexsalogДопустим есть документ (поля, атрибуты, все как положено), заполняемый несколькими пользователями. По части полей идет разделение доступа по ролям. Но, другие доступны для нескольких пользователей... И необходимо соблюсти версионность и историчность. Как в word.

Кс делать лучше?А вчем проблема?
Делать также как и во всевозможных RCS/CVS
Заблокировал, Изменил, Снял блокировку - изменения записались куда надо.
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34633228
Waytac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее:
1. Заблокировал на запись/удаление.
2. Изменил.
3. Если изменеия подтверждаются то п.4, если нет, то п.5.
4. Создаём новую запись с меткой кто изменил, когда и номер версии. Туда копируем тек. запись с изменениями.
5. Разблокируем текущую запись.

Если нужно, то можно ввести поле-флаг для обозначения последней (актуальной) записи, чтобы не искать каждый раз последнюю.
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34637066
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexsalogДопустим есть документ (поля, атрибуты, все как положено), заполняемый несколькими пользователями. По части полей идет разделение доступа по ролям. Но, другие доступны для нескольких пользователей... И необходимо соблюсти версионность и историчность. Как в word.

Кс делать лучше?
Я когда-то применял для решения похожей задачи (хранение истории изменений свойств объектов переменной структуры) EAV, причём и у сущности "instances", и у сущности "property values" были свойства "isActual", "creationDate", "creator". Соответственно, ничего не удалялось, просто объявлялось актуальным. Работало, но было сложно. Да и реализация поддержки целостности такой структуры и распределния полномочий - изобретение велосипеда, "СУБД над СУБД". Наверное, есть решение лучше.
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34738660
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно, тема давно закрылась
но попробую предложить

Свои логи мы храним готовым SQL в текстовом виде
перед удалением записи сохраняем текст SQL
Код: plaintext
INSERT INTO mytable (id, field1, field2) VALUES (val_id, old_val1, old_val2)

перед редактированием записи сохраняем текст SQL
Код: plaintext
UPDATE mytable SET field1=old_val1, field2=old_val2 WHERE id=val_id
так проще хранить и восстанавливать записи

В вашем случае, перед редактированием записи можно сохранять строку вида
Код: plaintext
sql_select="val_id as id, old_val1 as field1, old_val2 as field2"

Доступ к значениям полей получаем, составив и выполнив SQL запросы
Код: plaintext
1.
2.
sql_text='SELECT aa.id FROM (SELECT ' || sql_select|| ' FROM mytable) AS aa' 
sql_text='SELECT aa.field1 FROM (SELECT ' ||sql_select|| ' FROM mytable) AS aa' 
sql_text='SELECT aa.field2 FROM (SELECT ' ||sql_select|| ' FROM mytable) AS aa' 

Такой метод, наверное, не подойдет для мультимедийных данных,
но для бухгалтерии проще не придумать
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34738784
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел красиво, получилоси как сегда... :-(

Доступ к значениям полей получаем, составив и выполнив СЛЕДУЮЩИЕ SQL запросы
Код: plaintext
1.
2.
sql_text='SELECT aa.id FROM (SELECT ' || sql_select|| ') AS aa' 
sql_text='SELECT aa.field1 FROM (SELECT ' ||sql_select|| ') AS aa' 
sql_text='SELECT aa.field2 FROM (SELECT ' ||sql_select|| ') AS aa' 

точнее запрос с подзапросом
Код: plaintext
SELECT aa.id FROM (SELECT val_id AS id, old_val1 AS field1, old_val2 AS field2) AS aa  
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34738812
Aviant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sereginseregin так и не понял зачем хранить готовый SQL и что это дает
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34739371
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Историю изменений можно хранить сложными структурами со свойствами isActual, creationDate, creator и т.д., для каждого значения, как предлагалось выше...

А можно, перед каждым изменением, сохранять текстовую строку со старыми значениями, которую затем распарсивать.

Можно использовать и XML структуру. Но в СУБД с SQL-ем попроще.

Если история изменений используется только для отката старых значений, сохраняйте готовый INSERT перед удалением. В таком случае восстановление удаленной информации осуществится нажатием нескольких клавиш.
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34739625
Aviant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гм.
sereginsereginИсторию изменений можно хранить сложными структурами со свойствами isActual, creationDate, creator и т.д., для каждого значения, как предлагалось выше...

А можно, перед каждым изменением, сохранять текстовую строку со старыми значениями, которую затем распарсивать. Ну и как получить из распарсенного SQL-я эти самые creationDate, creator и т.п. если мне надо ?

sereginsereginЕсли история изменений используется только для отката старых значений, сохраняйте готовый INSERT перед удалением. В таком случае восстановление удаленной информации осуществится нажатием нескольких клавиш. а что мешает создавать этот insert только когда он нужен ?
...
Рейтинг: 0 / 0
Поддержка исправлений и версий
    #34740479
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AviantГм.
sereginsereginИсторию изменений можно хранить сложными структурами со свойствами isActual, creationDate, creator и т.д., для каждого значения, как предлагалось выше...

А можно, перед каждым изменением, сохранять текстовую строку со старыми значениями, которую затем распарсивать. Ну и как получить из распарсенного SQL-я эти самые creationDate, creator и т.п. если мне надо ?

Создаете таблицу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE my_log
(
    id int4, -- идентификатор 
    creationDate date, -- дата, а лучше и время
    creator int4, -- автор 
    
    table_name varchar( 128 ), -- таблица, в которой прошли изменения    
    rec_id int4, -- запись, в которой прошли изменения
    rec_deleted bool, -- флаг, true-запись удалена, false-изменена
    old_values varchar -- СТАРЫЕ ЗНАЧЕНИЯ одной строкой, например='old_val1 as field1, old_val2 as field2'
)

Теперь, используя триггеры (или другие инструменты), для тех таблиц БД которые вам важны сохраняете в my_log одной строкой старые значения тех полей, которые вам необходимы. Здесь есть автор, дата и версионность с историчностью.

Если старые значения сохранять в виде
Код: plaintext
'old_val1 as field1, old_val2 as field2'

то распарсивать их можно, составив динамический SQL
Код: plaintext
1.
2.
SELECT aa.field1 FROM (SELECT old_val1 AS field1, old_val2 AS field2) AS aa; 
SELECT aa.field2 FROM (SELECT old_val1 AS field1, old_val2 AS field2) AS aa; 
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Поддержка исправлений и версий
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]