Я пытаюсь реализовать стратегию строковой версии для таблиц в нашей базе данных OpenEdge.
Простое решение, которое я придумал, заключалось в добавлении целочисленного поля iRowVersion
в каждую таблицу и триггере записи для проверки и увеличения поля следующим образом:
TRIGGER PROCEDURE FOR WRITE OF Customer OLD BUFFER oldCustomer.
IF Customer.iRowVersion < oldCustomer.iRowVersion THEN
RETURN ERROR "RowVersion Out Of Date".
ASSIGN Customer.iRowVersion = Customer.iRowVersion + 1.
Это предотвратит перезапись любых одновременных изменений, однако я не уверен, что приращение на одну строку в каждой строке является лучшим. SQL ROWVERSION увеличивается по всей базе данных, и для эмуляции этого подхода вместо этого будет использоваться последовательность:
ASSIGN Customer.iRowVersion = NEXT-VALUE(rowVersionSequence).
В нашей большой базе данных, где будет меняться много записей, это может очень быстро увеличить последовательность. Наличие последовательности для каждой таблицы сократит это, но кажется чрезмерным, и подход +1 упрощает его.
Чтобы прояснить вопрос - было бы лучше увеличить номер версии строки на основе последней версии строки или следует использовать подход, подобный SQL, - делая каждую версию строки уникальной для базы данных.
Кроме того, будет ли триггер создания назначать начальную версию строки при переходе по стилю SQL? (в противном случае все новые неизмененные записи инициализируются с 0).