powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка записи на изменение
11 сообщений из 11, страница 1 из 1
Проверка записи на изменение
    #38574909
DFilushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

База данных в Firebird 2.5, необходим механизм подписывания записи в системе электронного документооборота.После подписывания документа запись "не может изменяться" ни программными средствами, ни сторонними средствами. На программном уровне это запретить можно, но сторонними - сомнительно.

Хотелось бы добавить расчёт контрольной суммы записи и проверять позднее при открытии документов, выводя предупреждение, что запись была изменена. Однако, записи содержат много связанных блобов в других таблицах, их тоже надо обязательно считать.

Сталкивались с таким, может есть другое решение?
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574915
Фотография aleksandr-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DFilushin,

я использовал триггеры
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574916
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DFilushin но сторонними - сомнительно.
триггеры
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574917
Фотография aleksandr-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DFilushin,

и еще как правило в одной строке с данными часть данных может участвовать в подписи, а часть может являться вспомогательными и не участвующими в ЭЦП, что нибудь для отображения документа или бог знает что еще, так же надо учесть что программа развивается и возможно изменение структуры данных и т.д. и т.п. тут только триггеры
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574920
DFilushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В триггерах подсчитывать контр. сумму или контролировать изменение данных?
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574922
DFilushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так и есть, надо было б считать не по всем полям, есть вспомогательные, их игнорировать
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574926
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DFilushinВ триггерах подсчитывать контр. сумму или контролировать изменение данных?
Запрещать изменения,
зы. И если я правильно понял то
если сработал триггер, то значит "изменения" были, так что контролировать изменения данных
смысла не имеет никакого и неважно были-ли на самом деле изменены значения полей или нет
достаточно контролировать значения флага "запись не может изменяться"
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574971
Фотография aleksandr-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я еще дополнительно к данным храню саму копию документа с данными, так как гарантировать, что что то не измениться, справочник или бог знает что еще, не возможно, лучше на всякий случай иметь копию документа, так же иногда сам документ меняется, колонки, подписи и т.д. очень сложно за всем уследить, так что копия самого документа не помешает
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38574995
Oliph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры здесь не очень красиво смотрятся.DFilushinнадо было б считать не по всем полям, есть вспомогательные, их игнорироватьНа каждое изменение таких вспомогательных полей будет вызываться триггер,
делающий неслабый обсчет контрольной суммы или как минимум проверку изменения нужных полей.

А если, как ты говоришь, объекты разбросаны по разным таблицам. Это ж какие триггеры будут…
Допустим, есть таблицы A, B, C.
Объект «Накладная» хранит данные в таблице А и С.
Объект «Служебная записка» хранит данные в таблице В и С.
При изменении таблицы С, триггер должен выяснить с каким объектом он связан
(придется добавить ключик принадлежности, или (о ужас!) искать через FK таблиц A и B)
и продолжать проверку. А если данные объекта размазаны более чем по двум таблицам,
то очень тяжело представить логику таких триггеров. Либо она будет многократно дублироваться,
либо придется писать хитрую процедуру, которая в начале своей работы будет разбираться кто и в связи с чем ее вызвал.

Если реализовать DML-операции через процедуры, как было отмечено в прошлом топике,
то проверка будет в том месте, где ей надо быть.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create procedure DML_Invoice_Update(id,<поля>)
Select флажок_не_изменять from A where id = :id
Если флажок_не_изменять  тогда exception ...;
... 
update A 
...
update C
...

Делай подобные DML процедуры и закрывай прямой доступ на insert/update/delete.
Процедурам которые меняют вспомогательные поля доступ на update даешь, это нормальная практика.

Сторонними средствами (если не знать пароля SYSDBA) ничего не получится изменить!
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38575009
DFilushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, тогда и црц не потребуется считать
поставили - закрыто - закрыли
...
Рейтинг: 0 / 0
Проверка записи на изменение
    #38575027
Oliph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно!
И подумай какая красота будет в программе.
В свойстве UpdateSQL пишешь просто:
Код: sql
1.
2.
3.
execute procedure DML_Invoice_Update(
:OLD_ID,
<поля>)

Аналогичное и для InsertSQL и DeleteSQL
Для тех, кто любит ООП, это есть инкапсуляция.
Что там творится внутри DML_Invoice_Update вызывающей программе не интересно.
Может со временем появится таблица D. Ты добавишь ее обработку в процедуре, а в программе ничего менять не нужно, разве что SelectSQL.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка записи на изменение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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