Вопрос знатокам DB/2

User avatar
Митяй
Уже с Приветом
Posts: 10000
Joined: 16 Jul 2003 18:47
Location: CA->AZ->DE->NJ-> AZ->GA->AZ

Re: Вопрос знатокам DB/2

Post by Митяй »

Dan70 wrote:Как бороться с кораптед данными в ДБ2?
Ситуация:
Чужое приложение периодически суёт пробелы, другие символы в поля таблицы типа Децимал. Та прога на РПГ нарисована, открывает таблицы, как обычные файлы.

Мне надо триггера повесить на эту табличку, что я и сотворил.
Но когда меняется рекорд, в котором хотя-бы одно такое поле корявое, триггер валится.
На этапе передачи ему ссылки на новые и старые данные (NEW ROW & OLD ROW) происходит похоже их валидация базой данных, которая и летит.
В теле триггера ни один эксепшн хэндлер не помогает, т.к. до него просто ход не доходит, всё раньше уже валится.

До кучи ещё и лог пишется непонятно куда, который разрастается.

Триггера должны быть системными, т.к. SQL триггера не работают, не позволяют той окоянной проге на РПГ открывать таблицы, как файлы.

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

Как с этим бороться?
Есть-ли например хотя-бы какие установки не писать этот ЛОГ, чтобы диск не забивался, или чистить его по достижении какого-нить размера?

Возможно-ли как-нить предотвратить эту валидацию данных, ну чтобы она шла в триггер по ссылке со всем этим крапом?

Буду очень всем благодарен за советы


Никаких системных триггеров не существует.
У вас есть левая программа, которая портит базу данных путем прямой записи в факл - и что вы хотите ? Радуйтесь, что она ее вообще не стирает. "А мог бы и шашкой рубануть !"

Единственный способ не портить базу - не запускать эту программу. Ну или чистить за ней.
А пристыдишь их - и сальцо найдется, и горилочка...
Dan70
Уже с Приветом
Posts: 297
Joined: 01 Oct 2003 03:28
Location: Siberia->Moscow->Chicago->NJ->NY->Montreal

Post by Dan70 »

Митяй wrote:
zVlad wrote: Прямой же доступ к файлам должен быть по идеи присекаться операционной системой поскольку RDBMS должна размещать те файлы для себя.


Не знаю как в AS400, а в Юниксе я не вижу способа методами OS запретить какой-то программе писать в файл, если у нее есть на это права.


просто в любой нормаьной Операционке и особенно Базе данных (типа ОРАКЛ, Sybase, SQL Server, etc) таблицы не хранятся в виде отдельных файлов, читабельных в удобоваримом формате.
И более того, БД всегда держит свои файлы залоченными (ну во всяком случае, пока она работает)
Здесь-же (в АС400 и ДБ2) вроде и БД ап энд ранниг, и кто ни поподя может одновременно напрямую в эти файлы лезть.
Dan70
Уже с Приветом
Posts: 297
Joined: 01 Oct 2003 03:28
Location: Siberia->Moscow->Chicago->NJ->NY->Montreal

Re: Вопрос знатокам DB/2

Post by Dan70 »

Митяй wrote:
Dan70 wrote:Как бороться с кораптед данными в ДБ2?
Ситуация:
Чужое приложение периодически суёт пробелы, другие символы в поля таблицы типа Децимал. Та прога на РПГ нарисована, открывает таблицы, как обычные файлы.

Мне надо триггера повесить на эту табличку, что я и сотворил.
Но когда меняется рекорд, в котором хотя-бы одно такое поле корявое, триггер валится.
На этапе передачи ему ссылки на новые и старые данные (NEW ROW & OLD ROW) происходит похоже их валидация базой данных, которая и летит.
В теле триггера ни один эксепшн хэндлер не помогает, т.к. до него просто ход не доходит, всё раньше уже валится.

До кучи ещё и лог пишется непонятно куда, который разрастается.

Триггера должны быть системными, т.к. SQL триггера не работают, не позволяют той окоянной проге на РПГ открывать таблицы, как файлы.

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

Как с этим бороться?
Есть-ли например хотя-бы какие установки не писать этот ЛОГ, чтобы диск не забивался, или чистить его по достижении какого-нить размера?

Возможно-ли как-нить предотвратить эту валидацию данных, ну чтобы она шла в триггер по ссылке со всем этим крапом?

Буду очень всем благодарен за советы


Никаких системных триггеров не существует.
У вас есть левая программа, которая портит базу данных путем прямой записи в факл - и что вы хотите ? Радуйтесь, что она ее вообще не стирает. "А мог бы и шашкой рубануть !"

Единственный способ не портить базу - не запускать эту программу. Ну или чистить за ней.


ну как это не существует (системных триггеров). если я их тут активно и повсеместно использую. Вот почитайте
http://publib.boulder.ibm.com/iseries/v ... mst175.htm

Не запускать левую прогу нельзя, как чистить за ней мгновенно. не знаю.
Эти-же самые системные триггера валятся из-за того. что БД пытается им передать апдейтед или инсёртед рекорд с кривыми данными, т.е. на этапе валидации данных, ещё не дойдя до самого триггера всё рушится.

Причём Вы можете написать абсолютно пустой триггер, который абсолютно ничего не делает, не читает, даже не ссылается на эти данные.
Ну например
begin atomic Declare nn int; set nn=1;end
И это всё равно будет валится именно на корраптед рекорде из-за краха при валидации всех полей.

И всё это безобразие в системный Еррор Лог АС400 пишется, какие-то дампы ещё в какие-то файлы кидаются, отчего все эти логи разрастаются до неузнаваемости.

Вот такая тут незадача.
User avatar
SVK
Уже с Приветом
Posts: 8255
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD
Been thanked: 1 time

Post by SVK »

Dan70 wrote:
Митяй wrote:
zVlad wrote: Прямой же доступ к файлам должен быть по идеи присекаться операционной системой поскольку RDBMS должна размещать те файлы для себя.


Не знаю как в AS400, а в Юниксе я не вижу способа методами OS запретить какой-то программе писать в файл, если у нее есть на это права.


просто в любой нормаьной Операционке и особенно Базе данных (типа ОРАКЛ, Sybase, SQL Server, etc) таблицы не хранятся в виде отдельных файлов, читабельных в удобоваримом формате.
И более того, БД всегда держит свои файлы залоченными (ну во всяком случае, пока она работает)
Здесь-же (в АС400 и ДБ2) вроде и БД ап энд ранниг, и кто ни поподя может одновременно напрямую в эти файлы лезть.

Да, уж... Ну, в описанной ситуации (если все действительно так, как написано) на AS/400 вообще так работать нельзя, по-моему? Разве только - для ведения домашнего бюджета на домашнем компьютере?

Например, в DB2/390 файлы БД распределяются "от имени" DB2 (при выполнении CREATE TABLESPACE и т.д.), и доступ к ним "сбоку" (мимо DB2 или ее утилит) пресекается OS независимо от того, работает сама DB2 или нет. Ну, разве только администратор самой z/OS может это изменить.
LG - Life's good.
But good life is much better.
Dan70
Уже с Приветом
Posts: 297
Joined: 01 Oct 2003 03:28
Location: Siberia->Moscow->Chicago->NJ->NY->Montreal

Post by Dan70 »

SVK wrote:
Dan70 wrote:
Митяй wrote:
zVlad wrote: Прямой же доступ к файлам должен быть по идеи присекаться операционной системой поскольку RDBMS должна размещать те файлы для себя.


Не знаю как в AS400, а в Юниксе я не вижу способа методами OS запретить какой-то программе писать в файл, если у нее есть на это права.


просто в любой нормаьной Операционке и особенно Базе данных (типа ОРАКЛ, Sybase, SQL Server, etc) таблицы не хранятся в виде отдельных файлов, читабельных в удобоваримом формате.
И более того, БД всегда держит свои файлы залоченными (ну во всяком случае, пока она работает)
Здесь-же (в АС400 и ДБ2) вроде и БД ап энд ранниг, и кто ни поподя может одновременно напрямую в эти файлы лезть.

Да, уж... Ну, в описанной ситуации (если все действительно так, как написано) на AS/400 вообще так работать нельзя, по-моему? Разве только - для ведения домашнего бюджета на домашнем компьютере?

Например, в DB2/390 файлы БД распределяются "от имени" DB2 (при выполнении CREATE TABLESPACE и т.д.), и доступ к ним "сбоку" (мимо DB2 или ее утилит) пресекается OS независимо от того, работает сама DB2 или нет. Ну, разве только администратор самой z/OS может это изменить.


Кто-бы мог подумать? Я серьёзно. Я думал, что ДБ2 везде такая кривая, как на 400.
Это действительно так. Ты пишешь
create table libname.tablename(aa char(1), bb decinmal(7,2), etc)
в результате в библиотеке libname создаётся физический файл, который запросто читается командами fopen, fread (или как они там на RPG зовутся, я для 400 на Си пишу, РПГ не знаю)
User avatar
SVK
Уже с Приветом
Posts: 8255
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD
Been thanked: 1 time

Re: Вопрос знатокам DB/2

Post by SVK »

Dan70 wrote:Не запускать левую прогу нельзя, как чистить за ней мгновенно. не знаю.

Вообще-то, такие проги надо исправлять/заменять/выбрасывать...

Для сиюминутного решения можно написать другую "левую" прогу, которая должна выполняться сразу за бракованной, и во всех decimal полях менять пробелы на нули...

Правда, если это сработает, тогда главная опасность - что всё так и останется в этом маразматическом состоянии до скончания века (XXI-го, по крайней мере)...
LG - Life's good.
But good life is much better.
Dan70
Уже с Приветом
Posts: 297
Joined: 01 Oct 2003 03:28
Location: Siberia->Moscow->Chicago->NJ->NY->Montreal

Re: Вопрос знатокам DB/2

Post by Dan70 »

SVK wrote:
Dan70 wrote:Не запускать левую прогу нельзя, как чистить за ней мгновенно. не знаю.

Вообще-то, такие проги надо исправлять/заменять/выбрасывать...

Для сиюминутного решения можно написать другую "левую" прогу, которая должны выполняться сразу за бракованной, и во всех decimal полях менять пробелы на нули...

Правда, если это сработает, тогда главная опасность - что всё так и останется в этом маразматическлм состоянии до скончания века (XXI-го, по крайней мере)...


Левейшая прога на РПГ - часть основного бизнес приложения компании :)
Написано, подправлено, подлатано несколько лет назад и несколько тысяч раз :) Помимо этого бага она творит миллион других, более серьёзных и плачевных для бизнеса. Её создатель стрижёт огроменные бабки за малейший чих, т.к. посадил компанию на крючёк.
Но даже заплатив ему, не получишь гарантии, что это будет исправлено, т.к. он уже сам запутался, где у него что и как.

Сейчас вместо неё разрабатывается нормальная структурированная (другой командой). т.е старой осталось жить, максимум, год.

Но как разрешить вот эти ньюансы?
Мне, новой системе, нужны данные и их изменения из старой системы (т.е. вот этой левой), поэтому я использую системные триггера.
Обычнве SQL триггера не позволяют РПГ проге открывать таблички, как файлы, из-за чего она входит в ступор, что недопустимо (она-ж окоянная бизнес нагрузку выполняет)

И Бог с ними, с кривыми данными. Что поделаешь, но как хотя-бы резвенько так эти Еррор и Дамп логи чистить избирательно, только за моими триггерами, чтоб они (дампы и еррор логи) не разрастались?
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Читаешь и волосы шевелятся на голове
Просто полный... Clipper :)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

Dmitry67 wrote:Читаешь и волосы шевелятся на голове
Просто полный... Clipper :)

Я заглянул на минутку и, ужаснувшись, сбежал.

Действительно, моментально на память приходят старые времена, банки, опердни :), бесконечная перестройка индексов и БД :) :), которую нельзя оставить на минуту без присмотра. Но у нас хоть девочки были симпатичные.
Увидев друга, Портос вскрикнул от радости...
google
Уже с Приветом
Posts: 136
Joined: 19 Mar 2003 11:18
Location: Moscow -> NYC ->CT

Post by google »

8K wrote:
Dmitry67 wrote:Читаешь и волосы шевелятся на голове
Просто полный... Clipper :)

Действительно, моментально на память приходят старые времена, банки, опердни :), бесконечная перестройка индексов и БД :) .

BTrieve, RSL-макросы, трехзвенка...
zVlad
Уже с Приветом
Posts: 15421
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Post by zVlad »

google wrote:
8K wrote:
Dmitry67 wrote:Читаешь и волосы шевелятся на голове
Просто полный... Clipper :)

Действительно, моментально на память приходят старые времена, банки, опердни :), бесконечная перестройка индексов и БД :) .

BTrieve, RSL-макросы, трехзвенка...


То что вы (начиная с Dmitry67) так дружно вспоминаете как кошмар не имеет ничего общего с обсуждаемым вопросом. Проблема здесь исключительно в неаккуратности (может быть преднамеренной) некоего программиста.
Заклинания, которые вы так эмоционально произносите, относятся к средствам плохо работавшим сами по себе - без злонамеренного программера. Чувствуете разницу?
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

zVlad wrote:Заклинания, которые вы так эмоционально произносите, относятся к средствам плохо работавшим сами по себе - без злонамеренного программера. Чувствуете разницу?

А еще были вирусы, которые злонамеренно переставляли байты в DBF'ках.

Ну, дайте поностальгировать, жалко, что ли?
Увидев друга, Портос вскрикнул от радости...
Kuznets
Новичок
Posts: 31
Joined: 28 Dec 1999 10:01
Location: Northville, MI

Post by Kuznets »

I am not sure how to get around that problem when creating SQL trigger. For C or RPG triggers you can retrieve record data into temporary data structure with char fields rather than decimals. Then for each decimal field in the record format you can test for the junk data before assigning it to the decimal field.

Actually, DB2 generates C trigger program from SQL trigger anyway. You can print the source listing and debug the trigger program if you add SET OPTION OUTPUT = *PRINT, DBGVIEW = *LIST to your CREATE TRIGGER statement before BEGIN ... END section.

Alternatively you could capture db changes using journals. I would think it's better than adding triggers as it doesn't affect an execution of the existing programs while triggers may cause the program interruption when they blow up. To use journals for data replication, you will have to write a program that uses QjoRetrieveJournalEntries API or you could also write an exit progam for RCVJRNE command.

Here is an article with some RPG samples that use QjoRetrieveJournalEntries API:

http://www.iseriesnetwork.com/resources ... iew=Search

hth
Dima
zVlad
Уже с Приветом
Posts: 15421
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Post by zVlad »

SVK wrote:
Dan70 wrote:
Митяй wrote:
zVlad wrote: Прямой же доступ к файлам должен быть по идеи присекаться операционной системой поскольку RDBMS должна размещать те файлы для себя.


Не знаю как в AS400, а в Юниксе я не вижу способа методами OS запретить какой-то программе писать в файл, если у нее есть на это права.


просто в любой нормаьной Операционке и особенно Базе данных (типа ОРАКЛ, Sybase, SQL Server, etc) таблицы не хранятся в виде отдельных файлов, читабельных в удобоваримом формате.
И более того, БД всегда держит свои файлы залоченными (ну во всяком случае, пока она работает)
Здесь-же (в АС400 и ДБ2) вроде и БД ап энд ранниг, и кто ни поподя может одновременно напрямую в эти файлы лезть.

Да, уж... Ну, в описанной ситуации (если все действительно так, как написано) на AS/400 вообще так работать нельзя, по-моему? Разве только - для ведения домашнего бюджета на домашнем компьютере?

Например, в DB2/390 файлы БД распределяются "от имени" DB2 (при выполнении CREATE TABLESPACE и т.д.), и доступ к ним "сбоку" (мимо DB2 или ее утилит) пресекается OS независимо от того, работает сама DB2 или нет. Ну, разве только администратор самой z/OS может это изменить.


Насколько мне известно на AS/400 существуют и успешно работают достаточно серьезные приложения в достаточно серьезных конторах и достаточно успешно.
Видимо DB2 на AS/400 имеет свои нюансы, которые просто нужно знать для успешной работы.
В DB2/390 (как впрочем в OS/390 в целом) файлы (наборы данных) распределяются программам таким образом что одновременный доступ возможен только в режиме чтения. Если набор данных не размещен ни для какой программы то доступ к нему определятся механизмом security. Таким образом если DB2 не активна, то набор данных может быть распределен тому кто имеет на этот набор данных права доступа. Даже если DB2 активна, табличное пространство можно "остановить" и делать с ним что позволено. Правда структура табличных страниц весьма не тривиальна, кроме того делая изменения в данных нужно бы заботиться об индексах. Короче на DB2/390 я никогда не слышал и думается не услышу об "умельцах" пишущих данные "напрямую".
А что на эту тему происходит в Оракл, Ms SQL?
Kuznets
Новичок
Posts: 31
Joined: 28 Dec 1999 10:01
Location: Northville, MI

Post by Kuznets »

In OS/400, DB2 is integrated into the one of the OS layers. Every table (physical file) is a DB2 table. There is no way for program to get a direct access to or manipulate with data storage... Everything is handled by DB2. However program can (in some cases) consider certain field as both decimal and character and that's what was the problem in Dan's case.

OS/400 supports old System/36 - type access to the database tables. Application program in this case considers record format as consisting of just one field with type of character and length equal to the length of the record. All data type conversions and parsing of this field to the actual fields happens within the program. So it's possible that some fields that should contain packed decimals, in example, are just filled with blanks because they were not properly initialized in the program. When such record is written to the table, DB2 does not perform the data type validation. When other programs use such table, it's their responsibility to ensure the data is correct.

At the same time, most of modern programs work with tables as externally described files. Program has all the field structure available and all type validation is handled by DB2. In this case DB2 will validate the data type before writing the record into the table.

Dima

Return to “Работа и Карьера в IT”