powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Ликбез по SB
10 сообщений из 10, страница 1 из 1
Ликбез по SB
    #32883558
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пару, м. б., тупых вопросов:

1. Как в Sybase организовано рождение unique id? 4 example, в InterBase для этого ЭстЪ GENERATOR'ы. Если аналогичный механизм ЭстЪ - то как получить значение этого unique id? 4 example, в IB SELECT GEN_ID(NEWCLIENT, 1) FROM RDB$DATABASE

2. Как можно однозначно идентифицировать запись в таблице, не имеющей
;) PK(UK)? 4 example, (пример тупой и не показательный): ЭстЪ таблица с
двумя записями:
Код: plaintext
1.
2.
3.
FIO                  BirthDate
Иванов Иван Иванович 13.02.1913
Иванов Иван Иванович 13.02.1913
Я рихтую ПЕРВУЮ запись
Код: plaintext
1.
update table_name set BirthDate='13.02.1941' where FIO='Иванов Иван Иванович' and BirthDate='13.02.1913'
рихтонет ОБЕ записи, а ната - ПЕРВУЮ...
Опять же, в InterBase ЭстЪ RDB$DB_KEY (подробности на ibase.ru)
Код: plaintext
1.
update table_name set BirthDate='13.02.1941' where RDB$DB_KEY=:IBX_INTERNAL_DBKEY

3. Поясните на пальцах назначение и использование поля timestamp, pls... Краем уха слыхал и понял, что оно идентифицирует номер версии данных записи (а-ля autoincrement) и при каждом update увеличивается... А как оно живет в контексте транзакций и их видов (SNAPSHOT, SNAPSHOT TABLE STABILITY, READ COMMITTED)?

P. S. Сильно не пинайте - доку по мере возможности и наличии времени читаю... Но, IMHO, лучше спросить - быстрее и понятнее-доступнее будет... FAQ'и смотреть - dial-up :(
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Ликбез по SB
    #32883561
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I'm so sorry :( - забыл добавить: ASE 12.5
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Ликбез по SB
    #32883778
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
2. Как можно однозначно идентифицировать запись в таблице, не имеющей
;) PK(UK)? 4 example, (пример тупой и не показательный): ЭстЪ таблица с
двумя записями:


Да никак. Причем не только в ASE - в любой СУБД.
Правда, если сделать
set rowcount 1
update table_name set BirthDate='13.02.1941' where FIO='Иванов Иван Иванович' and BirthDate='13.02.1913'
set rowcount 0
то измениться только одна запись

Но это несильно лечит - надо всегда иметь нормальный PK.
...
Рейтинг: 0 / 0
Ликбез по SB
    #32883839
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
3. Поясните на пальцах назначение и использование поля timestamp, pls...


Это бинарное поле, которое может быть только одно на таблицу, и если оно есть, то оно автоматически изменяется каждый раз в строке при изменении этой строки (при этом не учитывается, изменились ли реально данные строки или нет). Единственная допустимая операция над полем - сравнение на равенство или неравенство (= или <>). Заметьте, что ко времени этот тип данных не имеет никакого отношения и приводить его к типу datetime не имеет никакого смысла.

Применяется timestamp для реализации в приложении т.н. "оптимистической блокировки" по timestamp. Клиентское приложение читает данные, дает их изменять пользователю (кроме поля timestamp) и потом при сохранении данных выполняет запрос вида

Код: plaintext
1.
2.
3.
4.
5.
UPDATE theTable set fld1 = @fld1_val, fld2 = @fld2_val, ....
where pk = @pk
  and timestamp = @timestamp
if @@rowcount <>  1 
  raiserror  20000  'Запись не найдена или изменена другим пользователем. Прочитайте запись снова и повторите изменение.'

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

Ex_Soft
Краем уха слыхал и понял, что оно идентифицирует номер версии данных записи (а-ля autoincrement) и при каждом update увеличивается...

Неверно. timestamp не увеличиваестся, а просто изменяется. Он может измениться и "вниз", хотя для timestamp нет понятия "больше" или "меньше". Гарантируется только, что на достаточно большом периоде up-time-а сервера timestamp не будет неизменным при изменении данных.

Ex_Soft
А как оно живет в контексте транзакций и их видов (SNAPSHOT, SNAPSHOT TABLE STABILITY, READ COMMITTED)?


А никак. С изоляцией транзакций он не связан, просто тупо себе изменяется.
Если интересно, я могу рассказать, как timestamp реализован внутри, хотя это может быть даже вредно для его правильного использования.
...
Рейтинг: 0 / 0
Ликбез по SB
    #32883901
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
1. Как в Sybase организовано рождение unique id? 4 example, в InterBase для этого ЭстЪ GENERATOR'ы. Если аналогичный механизм ЭстЪ - то как получить значение этого unique id?


Какие ID имеются в виду ?
IDENTITY
или
newid()

Если newid() то его использовать можно точно так же, как INTERBASE-овские sequence. -
select newid() - и готов новый идентификатор.
...
Рейтинг: 0 / 0
Ликбез по SB
    #32883931
drptz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv

Ex_Soft
А как оно живет в контексте транзакций и их видов (SNAPSHOT, SNAPSHOT TABLE STABILITY, READ COMMITTED)?


А никак. С изоляцией транзакций он не связан, просто тупо себе изменяется.
Если интересно, я могу рассказать, как timestamp реализован внутри, хотя это может быть даже вредно для его правильного использования.

Расскажите пожалуйста.
...
Рейтинг: 0 / 0
Ликбез по SB
    #32884048
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну там достаточно тупо все.
Внутри сервера есть таймер, что-то типа GetTickCount() в WIN32 (возможно на Win32 оно так и реализовано). Он, кстати, доступен через глобальную переменную @@dbts.
При любом создании/изменении/удалении записи этот счетчик преобразуется в бинарку (а может быть он уже и есть в бинарке) и пишется в запись. Возможно, это не напрямую время (и скорее всего так), а как-то еще завязано на последовательность транзакций, поскольку сервер использует этот же счетчик для идентификации транзакций в логе, так что он должен быть уникальным для двух "одновременно" произощедших транзакций. Поэтому он при долгой работе сервера теоретически может и переполниться и "упасть вниз".

Ну и сразу становиться понятно происхождение самого названия timestamp.
...
Рейтинг: 0 / 0
Ликбез по SB
    #32886065
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivselect newid() - и готов новый идентификатор.
это дословно? ;) а то перерыл всю имеющуюся доку нЭт там newid(). Я так понимаю там хоть какой-то параметр д.б. идентифицирующий, 4 exanple, таблицу... Или это один на всех какой-то глобальный уникальный идентификатор?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Ликбез по SB
    #32886296
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newid()

newid
Description
Generates human-readable, globally unique IDs (GUIDs) in two different formats, based on arguments you provide. The length of the human-readable format of the GUID value is either 32 bytes (with no dashes) or 36 bytes (with dashes).

Syntax
newid([optionflag])
Parameters
option flag


0, or no value - the GUID generated is human-readable, but does not include dashes. This argument, which is the default, is useful for converting values into varbinary.

-1 - the GUID generated is human-readable and includes dashes.

-0x0 - returns the GUID as a varbinary.
...
Рейтинг: 0 / 0
Ликбез по SB
    #32886319
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там еще опечатка в доке - минусы перед 1 и 0x0 лишние.

В общем, возможные варианты и результат такие :

Код: plaintext
1.
2.
3.
select newid( 0 )
select newid( 1 )
select newid(0x0)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
result set # 1 .
Field  1 : 		Type : char( 36 ) (CS_CHAR_TYPE).

                                |
--------------------------------|
2e4cb41051114a32ac3ddea925849880|

  1  row(s).

result set # 2 .
Field  1 : 		Type : char( 36 ) (CS_CHAR_TYPE).

                                    |
------------------------------------|
0872f082-f8c2-4f45-9d66-dea925849880|

  1  row(s).

result set # 3 .
Field  1 : 		Type : binary( 16 ) (CS_BINARY_TYPE).

                                |
--------------------------------|
82b3d07cd58b4a469476de25988084a9|

  1  row(s).

...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Ликбез по SB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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