|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Привет всем, кто на форуме. Кто нибудь знает существует ли для Sybase SQL Anywhere 7, аналог IDENT_CURRENT(<имя таблицы>) из MS SQL Server. Если нет, то каким образом можно получить последнее значение AUTOINCREMENT - ог столбца определённой таблицы, если при этом существует вероятность, что будет осуществлено добавление записей в другие таблицы БД, которые содержат AUTOINCREMENT - ые столбцы или сработают триггеры на изменение, которые потенциально изменяют значение глобальной переменной @@identity. P.S. Так же хотел бы узнать изменяется ли значение @@identity если осуществлять вставку, обновление или удаление данных в одной транзакции, и получат ли пользователи из разных сессий свои корректные значения @@identity. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2003, 14:31 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Попробовал Каждый пользователь в пределах своей сессии получает свой @@identity, полученный после своих вставок в таблицы, и @@identity другой сесии не видит. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2003, 18:08 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
А, что на счёт изменения @@identity если на таблицу в которую вставляем запись висит триггер на Insert, и в этом треггере происходит запись в другую таблицу которая содержит AUTOINCREMENT(АЛЯ для логов)........??????? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2003, 18:20 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Итересный вопрос. Я думаю, что вернется идентити самой ближней (той, на которой триггер, а не в которую он добавляет записи) таблицы. Я проверял аналогичную ситуацию, когда в ближней таблице идентити не было, а в далней был. Согласно документации @@identity должен быть 0, так и было. Т.е. поведение такое, как будто дальней таблицы нет. Но нужно проверять. @@identity в сайбейзе работает корректно, каждый пользователь видит свой. Единственная обнаруженная проблема (ASA7), это если добавлять в такую таблицу записи, не закрыть транзакцию и стазу удалять добавленную запись, то пока транзакция не закрыта, таблица блокируется. Вроде ничего не напутал. Но это явный баг, возможно его профиксили. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2003, 01:51 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Итересный вопрос. Я думаю, что вернется идентити самой ближней (той, на которой триггер, а не в которую он добавляет записи) таблицы. Я проверял аналогичную ситуацию, когда в ближней таблице идентити не было, а в далней был. Согласно документации @@identity должен быть 0, так и было. Т.е. поведение такое, как будто дальней таблицы нет. Но нужно проверять. @@identity в сайбейзе работает корректно, каждый пользователь видит свой. Единственная обнаруженная проблема (ASA7), это если добавлять в такую таблицу записи, не закрыть транзакцию и стазу удалять добавленную запись, то пока транзакция не закрыта, таблица блокируется. Вроде ничего не напутал. Но это явный баг, возможно его профиксили. Тригер какраз весит на той таблице в которую добавляется запись. Но сам тригер пишет лог в другую таблицу в которой, так же есть AUTOINCREMENT - ый столбец(то есть column - identy), в следствии чего переменная @@identy - принимает значение последней добавленной записи в лог. Короче ситуация такова: FirstTable - таблица куда добавляем запись. FirstTrigger - триггер Before Insert для FirstTable. LogTable - таблица с логами. ID_1 - AUTOINCREMENT - ый столбец в FirstTable. ID_2 - AUTOINCREMENT - ый столбец в LogTable. В SP осуществляем вставку в FirstTable: Insert into FirstTable(Data) values(@Data) id_new_record = @@identity -- используем далеее значенние id_new_record Так вот после такой вставки в id_new_record получается не последнее значение ID_1(что очень нужно), а последнее значение ID_2. Так вот, если кто знает как всётаки решить такую проблемы буду очень благодарен, потому что вся работа встала из - за возникшей проблемы на ASA 7. P.S. Всем кто что-то пытается предложить огромное спасибо, пробую все возможные ситуации для ASA 7. Странно всётаки почему специалисты SyBase, не хотят позаботиться о программистах и создать пару функций/процедур как в MS SQL Server или Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2003, 10:06 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Тригер какраз весит на той таблице в которую добавляется запись. Но сам тригер пишет лог в другую таблицу в которой, так же есть AUTOINCREMENT - ый столбец(то есть column - identy), в следствии чего переменная @@identy - принимает значение последней добавленной записи в лог. Короче ситуация такова: FirstTable - таблица куда добавляем запись. FirstTrigger - триггер Before Insert для FirstTable. LogTable - таблица с логами. ID_1 - AUTOINCREMENT - ый столбец в FirstTable. ID_2 - AUTOINCREMENT - ый столбец в LogTable. В SP осуществляем вставку в FirstTable: Insert into FirstTable(Data) values(@Data) id_new_record = @@identity -- используем далеее значенние id_new_record Так вот после такой вставки в id_new_record получается не последнее значение ID_1(что очень нужно), а последнее значение ID_2. Так вот, если кто знает как всётаки решить такую проблемы буду очень благодарен, потому что вся работа встала из - за возникшей проблемы на ASA 7. P.S. Всем кто что-то пытается предложить огромное спасибо, пробую все возможные ситуации для ASA 7. Странно всётаки почему специалисты SyBase, не хотят позаботиться о программистах и создать пару функций/процедур как в MS SQL Server или Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2003, 10:07 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Всем огромное спасибо, кто пытался чем нибудь помочь. Проблеме решена. Тему - закрываю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2003, 13:32 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Расскажи как решил? Ситуация типичная, может пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2003, 23:45 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Решение. В тупую - так как универсального выхода оказалось, что нет и в ближайшем будущем скорее не предвидится(судя по официальной документации на SyBase), но я буду искать его. Короче: 1) Заменил AUTOINCREMENT - ый столбец в LogTable, на Max(ID_2) + 1. 2) Ужесточил порядок операций вставки и обновления в SP и Trigger - ах, таким образом, чтобы они не влияли на столбцы identity - во всех таблицах(ух и пришлось повозиться в Debuggere). 3) Выразил благодарность тех.поддержки SyBase в России. P.S. Решение не конкретное, так как оно будет сильно зависить от физ.модели БД и её логической структуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2003, 09:08 |
|
Аналог IDENT_CURRENT для SyBase
|
|||
---|---|---|---|
#18+
Да, я понял. Похоже есть проблема. Вот только что нашел в документации. When an insert causes referential integrity actions or fires a trigger, @@identity behaves like a stack. For example, if an insert into a table T1 (with an identity or autoincrement column) fires a trigger that inserts a row into table T2 (also with an identity or autoincrement column), then the value returned to the application or procedure which carried out the insert is the value inserted into T1. Если так не работает, то это баг. Тогда ничего более умного, чем поставить последний бак фикс, я придумать не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2003, 20:08 |
|
|
start [/forum/topic.php?fid=55&msg=32135297&tid=2014933]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 247ms |
total: | 384ms |
0 / 0 |