Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP / 22 сообщений из 22, страница 1 из 1
09.02.2005, 00:27
    #32907180
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Собственно говоря тест был мною проведен для определения, насколько использование триггеров по сравнению с DEFAULT LAST USER и DEFAULT TIMESTAMP при UPDATE будет отличаться по скорости выполнения (можно сказать родился с другого форума). Для теста я взял ASA 9.0.2.2551, создал новую БД с 8кб страницей, выделил 132 мб памяти под кэш, процессор Atlon XP2500, ОС XP SP2. Вот скрипт теста:
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
// Создаем таблицу
CREATE TABLE "DBA"."table1" (
	"id" integer NOT NULL DEFAULT autoincrement,
	"value" integer NOT NULL,
	"last_user" char( 10 ) NOT NULL,
	"last_time" timestamp NOT NULL,
	PRIMARY KEY ( "id" )
);
-- Execution time: 0.015 seconds

// Добавляем миллион записей одной транзакцией
BEGIN
  DECLARE @i int;
  SET @i =  0 ;

  WHILE @i <  1000000  LOOP
    SET @i = @i +  1 ;
    INSERT INTO table1 (value, last_user, last_time)
    VALUES (@i, CURRENT USER, CURRENT TIMESTAMP);
  END LOOP;

  COMMIT;
END;
-- Execution time: 34.219 seconds

// Проверяем кол-во записей
SELECT Count(*)
FROM table1;
-- Execution time: 0.485 seconds
-- 1000000 records

// Обновляем миллион записей одной транзакцией в чистом виде
BEGIN
  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 32 seconds
-- 1000000 record(s) affected

// Вешаем триггер на обновление для фиксации по записи
// последнего изменившего ее юзера и последнего времени изменения
CREATE TRIGGER init BEFORE UPDATE
ORDER  1  ON table1
REFERENCING NEW AS NewValue
FOR EACH ROW
BEGIN
  SET NewValue.last_user = CURRENT USER;
  SET NewValue.last_time = CURRENT TIMESTAMP;
END;
-- Execution time: 0.016 seconds

// Обновляем миллион записей одной транзакцией с триггером
BEGIN
  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 59.36 seconds
-- 1000000 record(s) affected

// Удаляем триггер
DROP TRIGGER table1.init;

// Вешаем на поля спец-DEFAULT значения
ALTER TABLE table1
  MODIFY last_user DEFAULT LAST USER,
  MODIFY last_time DEFAULT TIMESTAMP;

// Обновляем миллион записей одной транзакцией 
// с использованием встроенных возможностей DEFAULT
BEGIN
  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 33.203 seconds
--  1000000  record(s) affected
Из за того, что миллион записей неоднократно туда сюда обновлялся и гонялся по кэшу, я принимаю, что время чистого обновления таблицы и с DEFAULT равны (разница в 1 сек незначительна). Из чего следует вывод, что на скорость выполнения DML оператор DEFAULT не влияет. Если же посмотреть на скорость обновления миллиона записей с установленным триггером, то видна разница почти в 2 раза по сравнению с чистым UPDATE. Так что можно смело сказать, что LAST USER и TIMESTAMP здорово экономят время выполнения UPDATE на больших обьемах данных. Спасибо за внимание :)
...
Рейтинг: 0 / 0
09.02.2005, 01:41
    #32907205
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Пасиб. Не забуду при случае ответить тем же ;-)
...
Рейтинг: 0 / 0
09.02.2005, 01:51
    #32907209
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Если будет возможность, хотелось бы увидеть результаты прогона этого теста на FB2 - я специально не ставил на DML блокировку всей таблицы или изоляцию 3, чтобы ASA поднапряглась с PRIMARY KEY на позаписных блокировках. Интересно узнать, как быстро этот "тупой" тест выполнится на версионнике FB для расширения своего ликбеза.
...
Рейтинг: 0 / 0
09.02.2005, 01:57
    #32907212
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Меня вот больше интересует другое. Если таблица с LAST USER и TIMESTAMP реплицируется, то что попадет в эти поля после прихода изменений из удаленной базы? Боюсь, что будет имя, под которым dbremote работает. Если это так, то плохо и пригодно только для нереплицируемых таблиц. А при использовании триггера этим легко управлять.

Собираюсь проверить на досуге. О результатах сообщу.

--
http://talk.ru/forum/talk.ru.accounting.development
...
Рейтинг: 0 / 0
09.02.2005, 02:50
    #32907230
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Итак, имеем сервер Firebird WI-T2.0.0.10269 Alpha 1. Для теста создана новая БД с ODS 11.0 и размером страницы 8кб. Для базы установлен страничный кеш в 20К страниц (160МБ), все остальные настройки дефолтные. Режим изоляции транзакций - ReadCommitted. Железо - ноутбук Toshiba с CPU P-4 3.06GHz, RAM 512MB. ОС - WinXP Prof SP1.

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

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
/* создаем таблицу */

CREATE TABLE "table1" (
  "id" integer NOT NULL,
  "value" integer NOT NULL,
  "last_user" char( 10 ) NOT NULL,
  "last_time" timestamp NOT NULL,
  PRIMARY KEY ( "id" )
);

/* теперь генератор */

create sequence "seq";

/* ну и напоследок триггер, ибо
    автоинкремента мы не поддерживаем */

create trigger "generate" for "table1"
active before insert
as
begin
  new."id" = next value for "seq";
end;

commit;

/* заливаем данные */

execute block
as
  declare i int =  0 ;
begin
  while (i <  1000000 ) do
  begin
    i = i +  1 ;
    insert into "table1" ("value", "last_user", "last_time")
    values (:i, current_user, current_timestamp);
  end
end;
commit;
-- Execute time = 22s 281ms
-- 1000000 record(s) was(were) inserted into table1

/* проверяем кол-во записей */

select count(*) from "table1";
commit;
-- Execute time = 750ms
-- 1000000 record(s) was(were) selected from table1

/* обновляем все записи чистоганом */

update "table1" set "value" = "value" +  1 ;
commit;
-- Execute time = 21s 281ms
-- 1000000 record(s) was(were) updated in table1

/* вешаем на таблицу триггер */

create trigger "init" for "table1"
active before update
as
begin
  new."last_user" = current_user;
  new."last_time" = current_timestamp;
end;
commit;

/* обновляем все записи еще раз */

update "table1" set "value" = "value" +  1 ;
commit;
-- Execute time = 23s 594ms
-- 1000000 record(s) was(were) updated in table1

Даже если бы FB и поддерживал обсуждаемую фичу, то дальнейшие тесты все равно выглядели бы как-то бесперспективно ;-) И я еще говорил о 20%... мдя.

В общем, можно смело сказать, что это "бессмысленно, как безалкогольное пиво". Спасибо за внимание ;-)
...
Рейтинг: 0 / 0
09.02.2005, 10:02
    #32907472
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
ASCRUSИз чего следует вывод, что на скорость выполнения DML оператор DEFAULT не влияет. Если же посмотреть на скорость обновления миллиона записей с установленным триггером, то видна разница почти в 2 раза по сравнению с чистым UPDATE. Так что можно смело сказать, что LAST USER и TIMESTAMP здорово экономят время выполнения UPDATE на больших обьемах данных. Спасибо за внимание :)Можно я тоже влезу ? :)
IMHO тест показывает огромные накладные расходы ASA на вызов триггера. Дабы проверить это печальное предположение, предлагаю упростить триггер до пустого блока и повторить тест.
...
Рейтинг: 0 / 0
09.02.2005, 10:16
    #32907501
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
hvladIMHO тест показывает огромные накладные расходы ASA на вызов триггера. Дабы проверить это печальное предположение, предлагаю упростить триггер до пустого блока и повторить тест.

Упрощать нет смысла, результат вполне предсказуем. Я не верю, чтобы пара присваиваний работала в два раза дольше аналогичного дефолта. С этой стороны действительно обсуждаемая фича имеет заметное преимущество перед решением на основе триггера. Но переносить это на другие СУБД все же не стоит.
...
Рейтинг: 0 / 0
09.02.2005, 11:19
    #32907689
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Решил этот же тест прогнать на рабочей машине, заодно поиграться с блокировками. На рабочей машине стоят SATA винты и процессор Intel P4 2,4 (HT - получается 2 процессора, оба разрешены для использования в ASA).

В итоге:
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
// Обновляем миллион записей одной транзакцией в чистом виде
BEGIN
  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 22.828 seconds
-- 1000000 record(s) affected

// Обновляем миллион записей одной транзакцией в чистом виде
// с блокировкой всей таблицы
BEGIN
  LOCK TABLE table1 IN EXCLUSIVE MODE;

  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 15.187 seconds
-- 1000000 record(s) affected

// Обновляем миллион записей одной транзакцией с триггером
BEGIN
  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 60.985 seconds
-- 1000000 record(s) affected

// Обновляем миллион записей одной транзакцией с триггером
// и блокировкой таблицы
BEGIN
  LOCK TABLE table1 IN EXCLUSIVE MODE;

  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 54.265 seconds
-- 1000000 record(s) affected

// Меняем триггер, убирая из него изменение полей
ALTER TRIGGER init BEFORE UPDATE
ORDER  1  ON table1
REFERENCING NEW AS NewValue
FOR EACH ROW
BEGIN
  IF NewValue.value IS NULL
  THEN
    RAISERROR  20000  'Гы';
    RETURN;
  END IF;
END;
-- Execution time: 0.016 seconds

// Обновляем миллион записей одной транзакцией с триггером
// и блокировкой таблицы
BEGIN
  LOCK TABLE table1 IN EXCLUSIVE MODE;

  UPDATE table1
  SET value = value +  1 ;

  COMMIT;
END;
-- Execution time: 50.625 seconds
--  1000000  record(s) affected
Что можно по этому тесту сказать - если вешать эклюсивную блокировку на таблицу, то массовые обновления идут быстрее (кто бы в принципе и сомневался). Однако напрашивается еще один приятный вывод - позаписные блокировки в ASA реализованы достаточно граммотно, быстро и не кушают ресурсов, так как не такая уж большая разница во времени получилась на обновление между миллионом позаписных блокировок и одной табличной блокировкой (в среднем по всем тестам 5 сек).

Следующий вывод - BEFORE триггера, изменяющие записи, гораздо тяжелее, чем не делающие это. Кстати я тоже в этом не сомневался, так как могу точно сказать, что ASA крутит WatcomSQL c космической скоростью (взять хотя бы мой написанный на нем компилятор MacroSQL или на его основе написанный просмоторщик клипперных программ, загружающий их в БД, с преобразованием их скрипты в виде HTML веб-сервиса с подсветкой перехода на функции и таблицы для просмотра в браузере с целью снятия головной боли разбора чужих исходников на Clipper 5.0). Я думаю в данном случае при изменении записей в триггерах тормозит сама архитектура работы ASA, так как судя по всему порядок выполнения DML осуществляется в порядке для каждой записи:
1. DEFAULT
2. Блокировка
3. BEFORE FOR EACH ROW Триггера
4. CHECK
5. FOREIGN KEY
6. Физ.опер.записи в страницу, лог и индексы
7. SYSTEM CASCADE FOR EACH ROW Триггера
8. AFTER FOR EACH ROW Триггера
Схема приведена упрощенная, например, те же CASCADE могут вызываться по опции не как AFTER, а как BEFORE. С моей точки зрения кстати схема достаточно эффективная, так как любой BEFORE TRIGGER может вызвать исключение и произойдет откат изменений только всех успевших измениться записей (и блокировок тоже), а не всего массива записей, соотвествующе и откат произойдет быстрее. Тормоза же с триггерами думаю можно обьяснить не сколько замедлением выполнения из за выполнения WatcomSQL, сколько расширенным выделением ресурсов на выполнение триггеров, стоит помнить, что в ASA есть область видимости локальных временных таблиц, глобальных переменных и прочих фич, которые тоже напрягают сервер, да и выделение записных переменных или таблиц в REFERENCING тоже надо думать не прибавляет скорости.

Общий вывод - в FB2 триггеры работают гораздо шустрее, в ASA на массовые операции во многих случаях лучше вешать AFTER TRIGGER FOR EACH STATEMENT.

P.S. Кстати вопросик к dimitr - массовые вставки конечно же лучше проводить через специальные команды или утилиты (bcp, LOAD TABLE и т.д.). Как с этим обстоят дела у FB2 ? Например в ASA миллионы записей грузяться через LOAD TABLE достаточно шустро, эта команда не организует блокировок и работает на CHECKPOINT, как в принципе и REORGINIZE TABLE - кстати эти обе команды навевают на мысль, что CHECKPOINT в ASA (который позволяет БД работать и без лог-файла) подозрительно напоминает версионные принципы работы :)
...
Рейтинг: 0 / 0
09.02.2005, 11:21
    #32907692
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Интересно, ASCRUS, что ты столько сил потратил на доказательство того, что вполне очевидно : дефолт - это чисто декларативная штука, серверу это сделать легко, а триггер - его же выполнять надо.
...
Рейтинг: 0 / 0
09.02.2005, 11:40
    #32907731
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
ASCRUSСледующий вывод - BEFORE триггера, изменяющие записи, гораздо тяжелее, чем не делающие это.

50 сек против 54 сек? Я бы не назвал это "гораздо тяжелее". Достаточно ожидаемая разница.

ASCRUSОбщий вывод - в FB2 триггеры работают гораздо шустрее, в ASA на массовые операции во многих случаях лучше вешать AFTER TRIGGER FOR EACH STATEMENT.

IMHO тут все же играет роль WatcomSQL, каким бы шустрым он не был. А именно его интеграция в ядро сервера. В FB нет различия между SQL и PSQL, первое - это просто подмножество второго, оба являются нативным кодом и выполняются в ядре. Т.е. вызов триггера - это рекурсия в интерпретатор дерева выполнения плюс два копирования (из записи в OLD и из NEW в запись). Ну и создание сэйвпойнта, конечно.

ASCRUSP.S. Кстати вопросик к dimitr - массовые вставки конечно же лучше проводить через специальные команды или утилиты (bcp, LOAD TABLE и т.д.). Как с этим обстоят дела у FB2 ?

Эксклюзивных режимов массовой вставки (чтобы сэкономить на блокировках, версиях и прочая) нет в принципе, как нет и утилит. Предлагается штатный механизм т.н. внешних таблиц, которые представляют собой бинарные файлы со строками фиксированной длины. Они к базе отношение имеют только через метаданные, работают вне контроля транзакций. Имея такую таблицу, далее делаем просто INSERT INTO <database table> SELECT * FROM <external table>. Механизм достаточно удобный, но пока что не ахти какой быстрый (неоптимальная реализация - нет multi-block reads). Будет улучшено (читай: ускорено) в следующих версиях.
...
Рейтинг: 0 / 0
09.02.2005, 11:51
    #32907756
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
MasterZivвполне очевидно: дефолт - это чисто декларативная штука, серверу это сделать легко, а триггер - его же выполнять надо.

Что русскому хорошо, то немцу смерть (с) ;-)

Я оспорил данную очевидность и доказал свою правоту на отдельно взятом сервере. Если брать именно "выполнение" триггера, то его код между парой begin/end полностью идентичен паре дефолтов. Затраты появляются именно из-за "подготовки окружения" (за неимением лучшего термина) вызова триггера. А насколько они велики - зависит от СУБД.
...
Рейтинг: 0 / 0
09.02.2005, 12:10
    #32907822
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
авторИнтересно, ASCRUS, что ты столько сил потратил на доказательство того, что вполне очевидно : дефолт - это чисто декларативная штука, серверу это сделать легко, а триггер - его же выполнять надо.
Иногда очевидные вещи вдруг оказываются не очевидными. Я в ASA уже с этим сталкивался после опыта работы с MSSQL, думая что очевидное в MSSQL так же очевидно в ASA. Поэтому предпочитаю все проверять, благо что сил особо много прикладывать не приходиться :) Например совсем недавно я провел собственное исследование по блокировкам в различных уровнях изоляции и могу сказать, что BOL читать полезно, а вот все ручками тестировать позволяет понять архитектуру сервера на низком уровне и при проектировнии БД учитывать ньюансы механизма блокировок ASA. Один наглядный пример - пока я не повозился с BEFORE триггерами по поводу обновления полей записей и не выложил команде ASA парочку багов, в BOL не слова не было сказано об этих возможностях. После выхода патча по моим багам заодно дописали и BOL :) То же в принципе и касается использования промежуточных переменных в UPDATE (каюсь, во многом по моей вине, исправив мои замечания по багам здесь, они намутили кучу багов с UPDATE на remote server и мне все думалось - чего это я так часто икаю) :)

P.S. В принципе у меня есть еще в запасе парочка багов, которые можно найти, только очень постаравшись, но так как ситуация с ними маловероятна, я их не выкладываю в CASE, появится кто-то, кто в практическом использовании на них натыкался, тогда и нужно будет исправлять :)
...
Рейтинг: 0 / 0
09.02.2005, 13:42
    #32908181
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Александр ГoлдунМеня вот больше интересует другое. Если таблица с LAST USER и TIMESTAMP реплицируется, то что попадет в эти поля после прихода изменений из удаленной базы? Боюсь, что будет имя, под которым dbremote работает. Если это так, то плохо и пригодно только для нереплицируемых таблиц.
Проверил только что. Работает абсолютно корректно - просто пересылается апдейт этих полей с нужными значениями. А я по привычке использовал триггера с проверкой IF CURRENT REMOTE USER IS NULL
...
Рейтинг: 0 / 0
09.02.2005, 18:23
    #32908884
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Александр ГoлдунМеня вот больше интересует другое. Если таблица с LAST USER и TIMESTAMP реплицируется, то что попадет в эти поля после прихода изменений из удаленной базы? Боюсь, что будет имя, под которым dbremote работает. Если это так, то плохо и пригодно только для нереплицируемых таблиц. А при использовании триггера этим легко управлять.

Я уже проверял :) Приходит то что и должно прийти. В репликации, упоминаются все поля в которых изменилось значение. Если эти значения изменились под действием DEFAULT, то вот эти новые значения и пойдут в удаленую базу. А вот если они были сделаны триггером и репликация работает в режиме активных триггеров - в поле Last_user ты получишь имя юзера под которым к базе подключился dbremote.
Так что DEFAULT LAST USER со всех точек зрения, намного лучше триггера :)
...
Рейтинг: 0 / 0
09.02.2005, 18:37
    #32908917
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
White Owl
Так что DEFAULT LAST USER со всех точек зрения, намного лучше триггера :)
За исключением случая, когда используется справочник юзеров и вместо логина varchar ставится код integer. А вот насчет TIMESTAMP однозначно удобнее
...
Рейтинг: 0 / 0
10.02.2005, 08:19
    #32909320
E-doc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
White OwlТак что DEFAULT LAST USER со всех точек зрения, намного лучше триггера :) К сожалению не со всех. Мне все-таки пришлось делать триггер, чтобы реализовать функциональность "скрытого update" (я писал об этом в топике Значение по умолчанию для столбца )
...
Рейтинг: 0 / 0
14.05.2005, 13:45
    #33064638
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
White Owl Александр ГoлдунМеня вот больше интересует другое. Если таблица с LAST USER и TIMESTAMP реплицируется, то что попадет в эти поля после прихода изменений из удаленной базы? Боюсь, что будет имя, под которым dbremote работает. Если это так, то плохо и пригодно только для нереплицируемых таблиц. А при использовании триггера этим легко управлять.

Я уже проверял :) Приходит то что и должно прийти. В репликации, упоминаются все поля в которых изменилось значение. Если эти значения изменились под действием DEFAULT, то вот эти новые значения и пойдут в удаленую базу. А вот если они были сделаны триггером и репликация работает в режиме активных триггеров - в поле Last_user ты получишь имя юзера под которым к базе подключился dbremote.
Так что DEFAULT LAST USER со всех точек зрения, намного лучше триггера :)

Вот я и наступил на грабли с LAST USER в репликации :(
Если запись правится новым пользователем, то LAST USER отлично срабатывает, изменения корректно реплицируются в удаленную базу.
А вот при повторной правке записи тем же пользователем, в посылаемом сообщении в UPDATE отсутствует упоминание поля с LAST USER.
За то в таком случае на удаленной базе срабатывает LAST USER и прописывает юзера от dbremote.

Придется возвращать обратно триггера - они корректно такие вещи отрабатывали, даже в режиме активных триггеров. Просто нужно блок обрамить проверкой IF CURRENT REMOTE USER IS NULL
...
Рейтинг: 0 / 0
16.05.2005, 19:59
    #33068256
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
это явный глюк. Я с этим игрался еще на семерке - все было в порядке. Сейчас проверим... и будем писать в саппорт :)
...
Рейтинг: 0 / 0
16.05.2005, 20:24
    #33068277
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
White Owl пишет:
> это явный глюк. Я с этим игрался еще на семерке - все было в порядке.
> Сейчас проверим... и будем писать в саппорт :)

Почему глюк? По моему корректное и логично объясняемое поведение:
Если пользоватетель тот же, то LAST USER фактически не изменияет поле
=> изменение не попадает в лог => изменение не попадает в сообщение

На принимающей стороне dbremote производит UPDATE других полей, не
задевая поле с LAST USER => срабатывает LAST USER и выставляет значение
в логин от dbremote.

Где изъян в рассуждениях?
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
16.05.2005, 20:52
    #33068304
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Ну хорошо, не "глюк" а "фича" :)
Только оно все равно не должно так работать.
Прийдется делать еще одну главу в FAQ :(
...
Рейтинг: 0 / 0
16.05.2005, 23:59
    #33068461
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
Александр Гoлдун
Почему глюк? По моему корректное и логично объясняемое поведение:
Если пользоватетель тот же, то LAST USER фактически не изменияет поле
=> изменение не попадает в лог => изменение не попадает в сообщение
...
Где изъян в рассуждениях?
Вот здесь и изьян. LAST USER всегда изменяется - проверить легко, достаточно написать "UPDATE OF LastUser" триггер. Так что это баг или что то у Вас не так. Будет время, я тоже проверю :)
...
Рейтинг: 0 / 0
17.05.2005, 09:53
    #33068701
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP
ASCRUS пишет:

> Вот здесь и изьян. LAST USER всегда изменяется - проверить легко,
> достаточно написать "UPDATE OF LastUser" триггер. Так что это баг или
> что то у Вас не так. Будет время, я тоже проверю :)

Не показатель. Если я сделаю UPDATE любого другого поля, не изменив его
значения, то триггер на него тоже сработает, но в сообщение это не
попадет. Проверено.
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / BEFORE TRIGGER ON UPDATE vs DEFAULT LAST USER/TIMESTAMP / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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