получить автоинкреминированое значение

BugMaker 27.05.2004 - 11:26 | есть програмка на Delphi которая работает в InterBase c таблицами master-detail. После добавления записи в master триггером генерируется id, по которому потом связываются поля в detail. Но даже после выполнения post, id=null ! как освежить данные из таблицы, так что-бы строка осталась текущей в master-e?
ИгорьК 1 - 27.05.2004 - 13:47 | вставляй не триггером, а с клиента
Тупой ламер 2 - 27.05.2004 - 14:59 | ну кто ж на генерацию нового ID вешает триггер? не мучьте базу самый корректный способ организации ID - это метод Oracle, последовательности. это imho, конечно, но imho - выстраданное многими годами и проектами на разных базах. Если в вашей БД их нет, то самое правильное: для БД создать механизмы её эмуляции. Тем более, это несложно - одна таблица и пара-тройка процедур/функций. и вставлять, конечно, ID с клиента - это очень неправильное решение, которое в случае многопользовательской работы (и не только) может добавить целое поле для головной боли, усеянное граблями. . А задача обновления контента в визульном представлении данных - это задача не связанная с БД. Например, DevExpress решает её автоматически, ну а в остальных случаях несложно наприсать корректные обработчики транзакций, сохраняющих позицию текущей записи. Как правило, сводится к сохранению текущего ID и после апдейта рекордсета - локейт на неё. Это в простейшем случае.
BugMaker 3 - 27.05.2004 - 15:05 | База не моя. Я ее принимаю как есть. в триггере перед вставкой стоит строчка NEW.Table_Id = GEN_ID(Table_Id_GEN, 1);
ИгорьК 4 - 27.05.2004 - 15:19 | ну так исходники есть - поправь. или релоад после коммита делай или вставляй с клиенда, а триггер убери
Тупой ламер 5 - 27.05.2004 - 15:21 | тогда более точно сформулируй вопрос несностей слишком много на плохие вопросы не бывает хороших ответов
x77 6 - 27.05.2004 - 16:52 | тебе надо узнать значение нового поля до того, как оно уйдёт в таблицу. а это значит, что надо написать хранимую процедуру, которая возвращает тебе значение генератора (никаких граблей ни для каких режимов доступа здесь не будет). и вот это значение ты запоминаешь, постишь в базу, переоткрываешь её, и делаешь локате по запомненному значению. триггер придётся слегка изменить: ... if Table_Id is Null then New.Table_Id := :Table_Id else New.Table_Id := GEN_ID (Table_Id_Gen, 1); ... таким образом, во всех предудыущихз пректах ничего переделывать не придётся (как работали - так и будут работать), а в новых триггер будет смотреть - если значение нового поля ему скормили, то он его присваивает. если нет - то берёт очерелдной из генератора. . эмулировать секвенсы в ИБ - это круто.
tvv 7 - 27.05.2004 - 18:51 | А если использовать FibPlus, то там такие вещи уже реализованы и много других не менее приятных ...
ИгорьК 8 - 28.05.2004 - 08:42 | "эмулировать секвенсы в ИБ - это круто." - нафига их эмулировать-то ;-) генератор - это тож самое, только обзывается по другому.
Тупой ламер 9 - 28.05.2004 - 09:55 | я не работал с IB\FB в основном MS Access, MS SQL, SyBase, Oracle... поэтому GEN_ID воспринял как пользовательскую ф-ю ..если IB также умеет резервировать диапазоны пространства ключей, прозрачно разделять их между пользователями, централизованно управлять шагом распределения для всей БД и многое прочее - то что ж, разработчики IB сразу пошли верным путём.
ИгорьК 10 - 28.05.2004 - 10:13 | Ну не так круто, конечно ;-) Но свою роль они выполняют!
x77 11 - 01.06.2004 - 16:47 | Тупой ламер, всё гораздо ужаснее, на самом деле. понятия "простанство ключей" отсутствует как таковое, колючи для всех одни. более того, они не откатываются никогда, в .т.ч и при откате транзакции. если ты стартовал тран, получил новое значение генератора, например, 10, откатил тран, опять стратовал, опять получил - ты получишь 11 ! и это не глюк, а, скорее, фича :) генератор можно использовать как универсальный и абсолютно автономный счётчик любых процессов. . з.ы. шаг менять можно :)
FWP 12 - 02.06.2004 - 08:03 | ""простанство ключей" отсутствует как таковое" Никто не запрещает использовать несколько генераторов, задавать шаг и начало для каждого. Так что система довольно гибкая.
ИгорьК 13 - 02.06.2004 - 10:03 | "они не откатываются никогда" - есс-но не откатываеются! Иначе нахрена они нужны! "всё гораздо ужаснее" - вообще странная фраза! Хотеть от сервера, который умещается на дискету возможностей Оракла по меньшей мере неразумно, хотя в IB есть много вещей, которых в Оракле нет или появились совсем недавно.
x77 14 - 02.06.2004 - 13:05 | ну, напали... . можно подробнее, чего такого в IB много, чего в Оракле нет? просто интересно :)
ИгорьК 15 - 02.06.2004 - 13:11 | не, спор IB vs Oracle затевать не будем ;-)
x77 16 - 02.06.2004 - 13:33 | я его и не затевал. просто попросил развить мысль.
DrVisor 17 - 02.06.2004 - 13:40 | а двухфазный коммит в оракле есть?
asn 18 - 02.06.2004 - 13:42 | Чего нет в Interbase и чего есть в Oracle? В интербейзе нет большого секса с разработкой, особливо для небольших и средних проектах.
x77 19 - 02.06.2004 - 13:52 | asn, в Оракле его тоже нет. всё делается влёт. другое дело, что надо быть идиотом, чтобы ставить и лицензировать систему класса оракл на небольшой и средний проект, а в плане разработки - никаких проблем. . DrVisor, сказать честно, даже не знаю.... я и в ИБ его никогда не юзаю, только лишние геморрои, imho..
FWP 20 - 02.06.2004 - 14:33 | "можно подробнее, чего такого в IB много, чего в Оракле нет? просто интересно :)" Ну, к примеру, подписки на события. Или типа данных массив. VARCHAR коротковат. Да и версионником он стал совсем недавно, да и странноватым каким-то. Хотя в обратную сторону список будет конечно поболее:-).
x77 21 - 02.06.2004 - 16:00 | FWP, а разве ИБ - версионник? мне всегда казалось, что получить предыдущую версию записи невозможно, там понятие "версионность" носит несколько другой смысл.
FWP 22 - 02.06.2004 - 16:22 | "а разве ИБ - версионник?" Версионник, версионник. Самый первый и наверное пока единственный полностью версионник. Это у DEC было ноу-хау в свое время. А вот что значит "получить предыдущую версию записи" я не понял. P.S. Правда я не знаю как обстоят дела у Postgres. М.б. кто-нибудь просветит?
x77 23 - 02.06.2004 - 16:45 | FWP, ты говоришь про MGA - Multi Generational Architecture, смысл которой в том, что изменения данных не приводят к блокированию этих данных, и они по-прежнему доступны для чтения. что имеет смысл для OLTP, например. а я имел в виду версионность данных, когда изменения в самих данных храняться отдельно, что позволяет читать разные варианты редактирования одной и той же записи. сказать честно, я такую фишку видел только в программной реализации, и был уверен, что в промышленных СУБД этого нет в принципе. поэтому и удивился.
FWP 24 - 03.06.2004 - 08:02 | Я не говорил о MGA. Я говорил о способах реализации изоляции транзакций. Т.е версионные сервера и блокировочники. Только вот не пойму, почему ораклисты считают оракловую терминологию единственно правильной? Версионность в IB появилась уж не знаю в какой версии, но в 4.2 точно была. А это соответствует по времени Oracle 6. И тогда в нем ни о какой версионности речи не велось. М.б я и ошибаюсь конечно.
x77 25 - 03.06.2004 - 11:16 | я не ораклист. FWP, мы говорим об одном и том же. уровни изоляции транзакций в иб как раз и зависят от мга. на момент появления версии 5.0 технология всё ещё считалась уникальной, равно как и концепция "активной базы данных". вот эту технологию ты, как и многие другие, именуете версионностью. для меня, чисто интуитивно, верионность - это не создание копии записи для каждой транзакции, а сохранение последовательности изменений (версий) записи. в оракле, кстати, такого тоже нет. да и нигде, по-моему, нет.
FWP 26 - 03.06.2004 - 16:20 | "я не ораклист. FWP, мы говорим об одном и том же. уровни изоляции транзакций в иб как раз и зависят от мга" Тогда извини. Термин МГА я не встречал, потому и попутал. Просто сейчас на форумах ораклисты говорят о версионности оракла и выдают это как новейшее достижение компьютерной мысли. Концепция "активной базы данных" - это патентованная технология Borland. Правда неясно как они с FB ее делить будут.
x77 27 - 03.06.2004 - 16:58 | "сейчас на форумах ораклисты говорят о версионности оракла и выдают это как новейшее достижение компьютерной мысли". между тем, именно в IB были впервые реализованы и фильтрация блобов (как и сами блобы, впрочем. автором термина в разное время считались разные люди, начиная от Барри Рабинсона из DEC, Терри Маккивер из Apollo расшифровылала его как basic large object, Informix объявил о грядущей поддержке binary large object, а сам Джеймс Старкей утверждал, что слово вообще нихрена не значит). А крое блобов были ещё массивы, которые ввели по заказу какой-то самолётной компании, UDF в виде самостоятельных виндовых dll, именно в IB был впервые реализован дфухфазный коммит... да до фига чего. Типы в своё время наворотили столько, сколько ораклу и не снилось. А если условно поделить некий объём предлагаемого функционала на некий объём обеспечивающего его кода - ораклу останеться просто сосать :) . з.ы. всё-таки не удержался от восхваления любимой RDBMS :)

>>