Инвалидная процедура GAL.MEMO_INCREF

Администрирование баз данных (Pervasive.SQL, MS SQL, Oracle, утилита Support)

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Ogeeon
Новичок
Сообщения: 22
Зарегистрирован: 14 апр 2011, 11:46

Инвалидная процедура GAL.MEMO_INCREF

Сообщение Ogeeon »

Здравствуйте, коллеги!

У нас Галактика 9.1 на Оракле (11.2.0.4), версия support (и checkora9) 5.5.26.0.

Внезапно возникла такая проблема: при расчёте прав пользователя выдаётся ошибка:
"Не удалось записать мемо-поле в таблицу Rights. Статус потока=-4. Дополнительный статус=18"
"Права на меню: расчёт завершился неудачно. Статус=311"

Заглянули в Enterprise Manager - в списке инвалидных объектов два триггера в recycle bin и процедура GAL.MEMO_INCREF.
Описана вот так:

Код: Выделить всё

(MEMO_ID INTEGER, i INTEGER DEFAULT 1) as
  rc INTEGER;
BEGIN 
	SELECT NVL(REF#COUNT, 1) + i INTO rc FROM GAL.SYS#MEMO WHERE ID = MEMO_ID;
	IF rc <= 0 THEN
		DELETE GAL.SYS#MEMO WHERE ID = MEMO_ID;
	ELSE
		UPDATE GAL.SYS#MEMO SET REF#COUNT = rc WHERE ID = MEMO_ID;
	END IF;
  EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
END;
Ошибки компиляции:
Line # = 4 Column # = 13 Error Text = PL/SQL: ORA-00904: "REF#COUNT": invalid identifier
Line # = 4 Column # = 2 Error Text = PL/SQL: SQL Statement ignored
Line # = 8 Column # = 27 Error Text = PL/SQL: ORA-00904: "REF#COUNT": invalid identifier
Line # = 8 Column # = 3 Error Text = PL/SQL: SQL Statement ignored
Запустили checkora - она подтвердила, что объект MEMO_INCREF скомпилирован с ошибками, но исправить ситуацию не смогла.

Может, кто-нибудь знает, как быть? Сейчас выходные, народ не работает, но как только в понедельник пользователи начнут работу, могут массово пойти вставки в мемо-поля. И что будет, если проблема не только с таблицей прав?..
AlexMK
Новичок
Сообщения: 27
Зарегистрирован: 14 июн 2012, 20:30

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение AlexMK »

Добрый день.

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

Второй момент - не совсем понятно по поводу INCREF - она в корзине или таки в списке процедур, но просто невалидная ?

Если второе, то это не должно быть критичным и на работоспособность влиять не должно.
Расчет прав у пользователей должен проходить штатно.
Работа с сисмемо должна проходить без проблем.

Да, чека починить INCREF не сможет и ругнуться должна только один раз при проверке служебных объектов, когда найдет, что такой процедуры НЕТ.
Она создаст процедуру, хоть и компиляция её пройдет с ошибкой.
Этого достаточно для обеспечения штатной работы с SYS#MEMO.

И, конечно,чека будет ругаться на эту процедуру каждый раз, когда будет выполняться "проверка состояния объектов".
Однако этот пункт я рекомендовал бы забыть и не пользоваться им вообще, пока Галактическая поддержка не попросит :), а состояние объектов схемы смотреть внешними средствами.
А вот проверить триггера я бы порекомендовал.
Кроме того, желательно убедиться (с помощью внешних средств, например TOAD ( Deeps(Used by)) что процедурой INCREF не пользуются другие объекты схемы.
Если пользуются - это неправильные объекты.

ну и еще один вопрос:
Пробовали ли работать (рассчитывать права) после того как прогнали чеку ?
Ogeeon
Новичок
Сообщения: 22
Зарегистрирован: 14 апр 2011, 11:46

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение Ogeeon »

В ORA90DRV.log вот что:
ALTER PROCEDURE GAL."MEMO_INCREF" COMPILE
ORA-24344: success with compilation error
а ошибке расчёта прав соответствует такое сообщение:
SELECT MEMODATA FROM GAL."SYS#MEMO" WHERE ID = : P1
ORA-24801: illegal parameter value in OCI lob function
Насчёт инвалидных объектов можно перефразировать так: в EM в этом списке было 3 пункта: INCREF и 2 триггера, лежащих в корзине.

Проверку триггеров запускали, проблем нет с ними.

А вот насчёт успешности расчёта прав история запутанная:
- в пятницу днём всё рассчитывалось успешно
- вечером я запустил расчёт прав - получил ошибку; полез в EM, увидел список инвалидных объектов, запустил чеку с проверкой служебных объектов, таблиц и триггеров - всё ок. Запускаю расчёт прав - опять ошибка. Запустил чеку с проверкой состояния объектов и проверкой мемо-полей - увидел в логе "ошибка компиляции объекта MEMO_INCREF". Дальше, пока она проверяла мемо-поля, в какой-то момент попытался рассчитать права - получилось. Залез в EM - инвалидных объектов нет, вообще. Каюсь, не посмотрел другими средствами, в каком состоянии сама MEMO_INCREF.
- утром в субботу после завершения работы чеки ещё раз попробовал рассчитывать права - снова ошибка.

У нас есть тестовая база, на которую делается duplicate с основной каждую ночь - на ней всё рассчитывается без ошибок...

И да, TOAD на вкладке Deps(Used by) для процедуры MEMO_INCREF ничего не показывает - видать, нет у нас неправильных процедур.

Что это вообще за REF#COUNT? Поле такое должно быть в sys#memo? Судя по запросу

Код: Выделить всё

UPDATE GAL.SYS#MEMO SET REF#COUNT = rc WHERE ID = MEMO_ID;
это именно поле. Но у нас его нет: по-прежнему всего 2 поля в этой таблице - id и memodata.
sth73
Постоянный гость
Сообщения: 52
Зарегистрирован: 29 ноя 2005, 19:47

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение sth73 »

значит не только у нас такая канитель... хорошо :)
написал в ТП вопрос, жду ответа.

похоже на какой-то косяк в 5.5.26.0
AlexMK
Новичок
Сообщения: 27
Зарегистрирован: 14 июн 2012, 20:30

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение AlexMK »

Ogeeon писал(а):В ORA90DRV.log вот что:
ALTER PROCEDURE GAL."MEMO_INCREF" COMPILE
ORA-24344: success with compilation error
Это нормально, если можно так сказать. (в целом, конечно так не должно быть - все обьекты должны компиляться или их не должно быть в структуре).
Чутка недоглядели. Это задел на будущее в части оптимизации хранения данных в SYS#MEMO. По итогу её объем должен будет сильно уменьшиться со всеми вытекающими последствиями.
Ogeeon писал(а):...
а ошибке расчёта прав соответствует такое сообщение:
SELECT MEMODATA FROM GAL."SYS#MEMO" WHERE ID = : P1
ORA-24801: illegal parameter value in OCI lob function
а вот это к INCREF-у никакого отношения вообще не имеет.
Тут, скорее всего, из данных, ссылающихся на строку в SYS#MEMO "приходит" ID (значение), которое по сути не является допустимым для него.

О чем ОРАКЛ нам и сообщает.

Для выявления того, чо у нас там не так, нужно выполнить расчет прав при использовании протокольного драйвера ora90drv.dll.
По итогу он создаст протокол работы с БД, в котором подробно даст информацию о всех запросах и значениях параметров.
Вот тут-то и станет всё видно.
По поводу протокольного драйвера стоит обратиться в поддержку Галактическую.
Ogeeon писал(а):...
Насчёт инвалидных объектов можно перефразировать так: в EM в этом списке было 3 пункта: INCREF и 2 триггера, лежащих в корзине.
вот теперь понятно. :)
Ogeeon писал(а):...
Проверку триггеров запускали, проблем нет с ними.

А вот насчёт успешности расчёта прав история запутанная:
- в пятницу днём всё рассчитывалось успешно
- вечером я запустил расчёт прав - получил ошибку;
между этими событиями что-то обновлялось/менялось в составе атлантиса, с объектами БД что-то делали ? чеку запускали ? руками может быть что-то меняли/компилировали ?
Ogeeon писал(а):...
... Залез в EM - инвалидных объектов нет, вообще. Каюсь, не посмотрел другими средствами, в каком состоянии сама MEMO_INCREF.
да. досадно.
Хотя она ДОЛЖНА была быть инвалидной - SYS#MEMO не содержит поля REF#COUNT, соответственно процедура использующая его не может быть скомпилирована без ошибки.
Если процедура была, то должна была быть инвалидной. третьего не дано.
Ogeeon писал(а):...
- утром в субботу после завершения работы чеки ещё раз попробовал рассчитывать права - снова ошибка.
честное слово - такое впечатление, что Вы с разными базами работаете :)
Ogeeon писал(а):...
И да, TOAD на вкладке Deps(Used by) для процедуры MEMO_INCREF ничего не показывает - видать, нет у нас неправильных процедур.

Что это вообще за REF#COUNT? Поле такое должно быть в sys#memo? Судя по запросу

Код: Выделить всё

UPDATE GAL.SYS#MEMO SET REF#COUNT = rc WHERE ID = MEMO_ID;
это именно поле. Но у нас его нет: по-прежнему всего 2 поля в этой таблице - id и memodata.
да. это поле, которое со временем, возможно, появится в сисмемо. Сейчас его там быть не должно.

Еще раз акцентирую - наличие инвалидной процедуры MEMO_INCREF никак не влияет на работоспособность системы.
Ogeeon
Новичок
Сообщения: 22
Зарегистрирован: 14 апр 2011, 11:46

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение Ogeeon »

Да, действительно - впечатление, что с разными базами работаю. Однако ж нет. Даже не закрывая support-а получал разную картину. Сейчас полёт вроде нормальный, тьфу-тьфу-тьфу.
По поводу протокольного драйвера вот что мне ответили:
В 9.10 т.н. понятие протокольных драйверов включено в ситсиему логгирования, которая
включена в стандартную поставку как Саппорта, так и Галактики.
Вызов, настройка, запуск, и просмотр результатов логгирования возможен по пути
Сервис - Утилиты - Система логгирования.
Объем логгирования может отличаться, в зависимости от платформы, на которой работает система.
Для MS SQL и Oracle существуют возможность включения/отключения вывода в лог событий дарйвера СУБД.
AlexMK
Новичок
Сообщения: 27
Зарегистрирован: 14 июн 2012, 20:30

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение AlexMK »

Ogeeon писал(а):... Сейчас полёт вроде нормальный, тьфу-тьфу-тьфу.
По поводу протокольного драйвера вот что мне ответили:
Да есть такая штука.
Однако это не совсем то.
Вернее это тоже протоколирование, но предназначено для более широкого анализа работы приложения.
При этом для просмотра отчета требуется спец-средство.

В протокол пишется информация о работе на уровне трассировки вызовов модулей, процедур, функций и даже отдельных операторов VIP-а всего приложения.
В том числе и запросы к БД.

Протокольный драйвер ORA90DRV.DLL пишет в текстовый файл только результирующие транслированные в нативную форму запросы с ORACLE.

Как-то так.

Ну да ладно - работает и славно.
Пусть так и остается :)
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение Den »

ну вообще то для 9,1 протокольные модули выкладывали тоже

ftp.galaktika.ru/pub/support/temp/SmartTimeProtocols

но, кто то, видимо, решил что 5,5,18 и харэ дальше.
AlexMK
Новичок
Сообщения: 27
Зарегистрирован: 14 июн 2012, 20:30

Re: Инвалидная процедура GAL.MEMO_INCREF

Сообщение AlexMK »

Den писал(а):ну вообще то для 9,1 протокольные модули выкладывали тоже

ftp.galaktika.ru/pub/support/temp/SmartTimeProtocols

но, кто то, видимо, решил что 5,5,18 и харэ дальше.
Еще раз - SIL-протоколирование это фактически механизм протоколирования и профилирования.
Содержит в себе логи событий + временные отметки.
Выполняет протоколирования на уровнях вплоть до отдельных VIP-операторов.

Действительно, в предыдущих версиях атлантиса SIL-протоколирование имплементировалось отдельными сборками модулей, строго привязанными к версиям атлантиса.
Начиная с версии 5.5.20 (если мне память не изменяет) всегда собирается в составе стандартной поставки.
Включается и выключается динамически в желаемый момент времени.

А я говорил о протоколировании на уровне драйвера СУБД.
Протоколируются ТОЛЬКО конечные запросы к СУБД с параметрами и результаты их выполнения с записью в протокол кодов выполнения и результатов выборок.
Временные метки не пишутся.

Для просмотра и анализа SIL-протоколов необходимо специальное ПО.
Для просмотра протоколов дравера к СУБД достаточно любого текстового вьювера.

Протокольные драйвера СУБД поставляются только по отдельному запросу и обычно в рамках решения какой-то проблемы у Заказчика.
Т.к. значительный объем вывода в текстовом виде сильно замедляет работу приложений.

как-то так.
Ответить