Упорядочить по времени создания в OpenEdge

Существует ли автоматический способ узнать, какие строки были добавлены последними в таблицу OpenEdge? Я работаю с клиентом и имею доступ к их базе данных, но они не сохраняют ни идентификаторы, ни отметки времени для данных.

Мне было интересно, надеюсь, что OpenEdge каким-то образом делает это из коробки. (сомневаюсь, но проверить не помешает)

Изменить: Моя цель

Моя цель состоит в том, чтобы иметь возможность импортировать только новые данные, то есть дельту, из конкретной таблицы. Не зная, какие строки являются новыми, я вынужден импортировать все, потому что понятия не имею, что было добавлено.


person n_x_l    schedule 01.09.2014    source источник
comment
Думаю, сортировка по ROWID() поможет. Я не уверен, насколько это уникально :(   -  person Austin    schedule 01.09.2014
comment
Нет, сортировка по ROWID не поможет. Строки можно вставлять куда угодно, а ROWID можно использовать повторно.   -  person Tom Bascom    schedule 02.09.2014
comment
Почему вы думаете, что хотите знать, какая запись самая последняя? Понимание причин может указать на другое и, возможно, лучшее решение.   -  person Tom Bascom    schedule 02.09.2014
comment
@TomBascom Я хочу иметь возможность опросить новые данные. Я просто смотрю, смогу ли я добиться этого, не прося клиента вставлять полезные метаданные, такие как временные метки. Очевидно, если я не могу, то мне нужно поговорить с ними.   -  person n_x_l    schedule 02.09.2014
comment
Если вы дадите больше информации о таблице и ее содержимом, как часто она обновляется и т. д., возможно, кто-нибудь сможет вам помочь. Также могут быть доступны другие источники данных, например, если у базы данных есть веб-интерфейс, у вас вполне могут быть журналы доступа, которые вы можете обрабатывать?   -  person Jensd    schedule 02.09.2014
comment
Почему вы хотите опросить новые данные? Вот почему также могут быть полезны полезные предложения. (Одним из возможных решений может быть использование триггеров репликации.)   -  person Tom Bascom    schedule 02.09.2014
comment
@TomBascom В своем приложении я импортирую все их данные из некоторых таблиц, затем из этих данных мы создаем новые таблицы, которые подходят для наших целей. Мне нужно опрашивать новые данные, потому что нет смысла каждый раз импортировать все данные, что, к сожалению, я и делаю, учитывая, что невозможно узнать, что нового, а что старого. Данные представляют собой четыре текстовых столбца, не более того. Даже без идентификаторов.   -  person n_x_l    schedule 02.09.2014
comment
Я также обновил вопрос, указав, что я считаю своей целью из всего этого. Извините, что не предупредил об этом.   -  person n_x_l    schedule 02.09.2014


Ответы (2)


1) Короткий ответ: нет - у вас нет «стандартного» способа указать, какие записи были добавлены или в каком порядке они были добавлены.

Единственный способ определить порядок создания — применить последовательность или поставить метку времени записи. Поскольку ваше приложение не делает ни того, ни другого, вам не повезло.

2) Если вы ищете изменения без применения изменений схемы, вы можете фиксировать изменения, используя триггеры сеанса или базы данных, чтобы фиксировать обновления в базе данных и сохранять где-нибудь этот журнал активности.

3) Если вы просто ищете «дельту» - вы можете периодически делать резервную копию базы данных, а затем использовать запросы для сравнения текущей базы данных с резервной базой данных и таким образом получать различия.

4) Поддерживайте БД на сайте заказчика с содержимым последнего дампа таблицы. В следующий раз, когда вы захотите получить дельты от клиента, сравните содержимое этой таблицы с текущей таблицей, выгрузите различия, а затем обновите таблицу базы данных, чтобы она соответствовала текущей таблице базы данных.

5) Лично. Я бы поговорил с клиентом и посмотрел, (а) действительно ли ему нужна эта функциональность, (б) узнаю, что они думают о добавлении некоторых полей и небольшого количества кода в систему для получения журнала действий. Добавление нескольких полей и некоторого кода для их обновления не должно быть такой большой проблемой.

person Tim Kuehn    schedule 02.09.2014
comment
Привет, @Tim, посмотри мой последний комментарий к исходному вопросу. - person n_x_l; 02.09.2014
comment
используйте запросы, чтобы сравнить текущую базу данных с резервной базой данных и таким образом получить различия. Что вы имеете в виду здесь? Как можно сравнить, скажем, целую таблицу с ее резервной копией, не просматривая последовательно все это? И разве это не противоречит цели моего маленького проекта? Я обновил свой вопрос, объясняя реальную цель, почему мне нужна эта функциональность. - person n_x_l; 02.09.2014
comment
Я изменил № 4 на № 5 и добавил новый № 4, чтобы понять, что вы делаете. - person Tim Kuehn; 02.09.2014
comment
Номер 4 не будет работать, потому что у меня есть доступ только для чтения. Но я могу сделать это на своей локальной машине, но даже тогда, как сравнить две таблицы в openge таким образом, чтобы гарантировать быстрый поиск дельты? - person n_x_l; 02.09.2014
comment
Создайте новую базу данных где-нибудь на клиентском компьютере или на клиентском сайте и используйте ее для хранения последней таблицы дампа. Все, что вам нужно, это доступ для чтения к базе данных клиента для сканирования таблицы, сравнения ее с последней таблицей дампа в вашей маленькой боковой базе данных, а затем создания дампа файла изменений для отправки на ваш локальный сайт для обновления ваших записей. - person Tim Kuehn; 02.09.2014
comment
ОК, это звучит хорошо. И последний вопрос: как можно эффективно определить дельту между двумя таблицами в openge? Думаю конструктив МИНУС, но есть ли что-то более эффективное? - person n_x_l; 02.09.2014
comment
Используйте два запроса — по одному для каждой таблицы в одном и том же порядке сортировки, а затем последовательно просматривайте их списки результатов по одной записи за раз. Если запись отсутствует в той или иной таблице или между ними есть разница - тогда у вас есть ваша дельта. - person Tim Kuehn; 03.09.2014
comment
В конечном итоге вы просканируете все данные. Если таблицы большие, это будет не очень эффективно. Вы упомянули МИНУС, что заставляет меня думать, что вы надеетесь использовать SQL. Это также будет представлять неожиданные проблемы. Если вы заботитесь об эффективности, убедитесь, что клиент запускает UPDATE STATISTICS, чтобы оптимизатору было с чем работать. Приложения Progress часто игнорируют заявленную ширину полей и заполняют их. Это, как правило, подходит для программ SQL. Утилита dbtool будет сканировать данные и соответствующим образом корректировать SQL-WIDTH, но ее необходимо запускать периодически. - person Tom Bascom; 03.09.2014
comment
без механизма захвата событий невозможно избежать сканирования двух таблиц, чтобы получить то, что он хочет. Если он делает это только раз в неделю или около того, отсутствие эффективности не будет проблемой. - person Tim Kuehn; 03.09.2014
comment
Спасибо за исчерпывающий ответ @TimKuehn. - person n_x_l; 03.09.2014

Вы можете использовать триггеры базы данных, чтобы удовлетворить эту потребность. Для этого вам нужно будет уметь писать и развертывать триггерные процедуры. И нужно иметь в виду, что движки 4GL и SQL-92 не распознают триггеры друг друга. Таким образом, если обновления возможны через SQL, триггеры 4GL будут слепы к этим обновлениям. И наоборот. (Если вы не используете SQL, все это не имеет значения.)

Вы, вероятно, захотите использовать триггеры WRITE для захвата как вставок, так и обновлений данных. Вас волнуют удаления?

Простодушный триггер WRITE 4gl:

TRIGGER PROCEDURE FOR WRITE OF Customer. /* OLD BUFFER oldCustomer. */  /* OLD BUFFER is optional and not needed in this use case ... */

  output to "customer.dat" append.

  export customer.

  output close.

  return.

end.
person Tom Bascom    schedule 03.09.2014
comment
Это №2 в моем списке вариантов... :) - person Tim Kuehn; 03.09.2014