Variant, UDF и Instead-триггеры, цепляемые ко view

Александр Гладченко
Дата: 06.01.2001 14:34:40
Недавно я получил письмо, в котором Андрей Гордиенко предлагает обсудить новые возможности и новые проблемы MS SQL Server-2000. Вот что он пишет:

...Лично меня очень заинтересовали Variant, UDF и Instead-триггеры, цепляемые ко взгляду (от автора рассылки: на сколько я понял, имеется ввиду представление - view). Для меня эти три возможности, продекларированные для новой версии, в корне меняют подходы к тем проблемам, которые я пытаюсь решить в версии 7.0 с помощью совершенно неприспособленных для этого методов. Хочу найти единомышленников из числа тех, для кого переход на версию 2000 является жизненной необходимостью. Рассчитываю на отклики тех, кто её пощупал и смог обойти подводные камни, на которые я наткнулся.
Я пытался сделать тестовую установку, и сразу столкнулся с множеством проблем, о которых и хочу предупредить потенциальных или фактических собратьев по несчастью.
Я создал таблицу и взгляд, который выбирал некоторую часть записей из этой таблицы и одновременно ограничивал набор полей только "рабочими" полями (часть полей используется для журнализации и прочих служебных целей, с которыми имеют дело только триггеры). Ко взгляду я прицепил три Instead-триггера - на удаление, вставку и изменение. После чего обнаружил следующее. При попытке править, удалять или вставлять записи во взгляд через Query Analyzer триггеры отрабатывают - все происходит, как задумано, душа поет. Но стоит попробовать делать эти операции через OLEDB из какой-либо клиентской программы, либо из Enterprise Manager (Open - All rows), который, кстати, работает через ODBC - так же как и Query Analyzer, записи прямиком попадают в базовую таблицу, Instead-триггеры не запускаются, словно их вообще не существует. На конференции на sql.ru мне ответили, что, скорее всего, проблема в сетевых библиотеках. Хотелось бы получить какое-нибудь дальнейшее развитие этой темы.
Еще один глюк. Сделал UDF, которая вызывается в качестве значения Default для поля таблицы. В тексте этой UDF вызывается ниладическая функция SYSTEM_USER. При работе из Query Analyzer SYSTEM_USER возвращает 'sa', а при работе из EM эта же функция возвращает сетевое имя в виде 'Domain_name\User_name', хотя в EM я зарегистрировал сервер тоже под 'sa'. Полагаю, тут тоже подпакостили сетевые библиотеки.
Дальше больше (все что дальше, касается только программистов, использующих Delphi 5 + ADO). Наткнувшись на перечисленные глюки, я деинсталлировал MS SQL Server 2000. При попытке продолжить работу над программами, которые я раньше писал в Delphi+ADO, стала выскакивать ошибка "... BOF or EOF..." при попытке открыть или закрыть любой источник записей, в котором записей не содержится (просто открыть, больше ничего). Переустановка MDAC версий 2.1 и 2.5 не помогла. Оказалось, что MDAC 2.6, который устанавливается вместе с MS SQL Server 2000, БЕССМЕРТЕН. Удалить его уже невозможно. А ошибка возникает из-за несовместимости ADO-компонентов Delphi с этой версией. На сайте Borland выложен патч, который лечит данную ошибку. Я его скачал и установил. "... BOF or EOF..." исчезла. Однако, события ADO-компонентов OnDeleteError, OnPostError и аналогичные перестали нормально работать. Конкретно, если в этих событиях сделано присвоение Action:=daAbort, это не выводило программу в нормальное русло с отменой операции как положено тому быть, программа зацикливалась с постоянной выдачей одного и того же сообщения об ошибке. В результате для того, чтобы вернуться к нормальной работе, мне пришлось переустанавливать на своем компьютере систему - потом уже ставить MDAC более ранней версии.
Возможно, я не нашел каких-то реально существующих менее болезненных путей решения описанных выше проблем. Очень хочется узнать мнение собратьев.

С уважением,
Андрей Гордиенко
hydro@corbina.ru
Дед Маздай
Дата: 06.01.2001 23:31:32
Сказка про белого бычка, уже здесь обсуждавшаяся. Ну не переписали мужики курсорную библиотеку к OLE DB-провайдеру, ну что ж теперь, повеситься что ли. Делайте не rs.AddNew, a cn.Execute("insert ...
Описанное поведение с system_user не подтвердилось. У меня все работает нормально.
Fompro
Дата: 08.01.2001 11:37:08
По поводу UDF. Возвращаемое значение в виде Domain_name\User_name наблюдалось и в QA и в EM только при Windows authentication.
Павел
Дата: 09.01.2001 18:10:30
Ине удалось снести MDAC 2.6 менее радикально: просто грохнул каталои C:\Program Files\Common Files\SYSTEM\ADO, ...\Msadc, ...\ole db и переинсалил MDAC 2.5.
Garya
Дата: 23.01.2001 22:33:55
2 Дед маздай.
А что у тебя с курсорной библиотекой все в порядке? И Instead-триггеры нормально работают? Может, зашлешь библиотеку на мыло?
Вот адрес:
hydro@corbina.ru

Насчет cn.Execute - я не понял, ты предлагаешь переписать все ADO-компоненты (речь идет об ADO в Delphi5), которые стандартно используются для работы с MS SQL? Или отказаться от использования готовых компонентов и лепить свои? Можно, кончено, обойтись и без компонентов, и даже без языка высокого уровня (колупать на асемблере), и даже без SQL-сервера... Но все-таки хочется не громоздить себе проблемы, а иметь возможность быстро и эффективно их решать.
Только одна проблема - невозможность полноценного использования Enterprice Manager - разве эта проблема такая маленькая, что на нее можно махнуть рукой? Без обид. Предлагаю помогать друг другу (по возможности), а не просто отмахиваться.
И еще. Реализация бизнес-логики на сервере преследует не одну, а множество целей. Одна из них - обеспечить одинаковую обработку и механизмы авторизации при доступе к данным ИЗ РАЗНЫХ ПРИЛОЖЕНИЙ И РАЗНЫМИ СПОСОБАМИ. Так что, на это тоже махнуть рукой? А если какой юзер полезет в базу из WORD-а, не установив нужных библиотек и не прочитав предварительно сообщения на данной конференции? А если он просто полезет в базу с помощью Enterprise Manager-а (который не работает)?

Несколько туманная (для меня, по крайней мере), присказка относительно белого бычка. На конфе в вопросе была просьба сообщить, у всех ли этот эфект проявляется. По части неполноценности Instead-триггеров было подтверждение, что глючат не только у меня. По SYSTEM_USER были сообщения, что глюк не подтверждается. Не было ни одного сообщения о том, что Instaed-триггеры у кого-то работаю нормально (именно в описанных условиях). Следует ли фразу про бычка понимать так, что у всех все работает нормально, и вопрос поднят на пустом месте?
Кстати, SYSTEM_USER у меня тоже нормально работает, до тех пор, пока его не воткнешь в UDF, которая вызывается в качестве значения по умолчанию в одном из столбцов таблицы. Я не уверен, что сообщения о не подтверждении второго глюка пришли после имитации именно указанных условий для его возникновения.

Для ясности. Я - автор поднятого вопроса.
Дед Маздай
Дата: 31.01.2001 19:57:18
По поводу вопроса про установленные у меня курсорные библиотеки и того, что я предлагаю. Мне казалось, что это ясно из предыдущих сообщений, но тем не менее. Курсорные библиотеки у меня такие же. Соответственно, эффект с instead-of триггерами воспроизводится как он есть. В ближайшее время от него никуда не деться. Вам не принесут завтра на дом dllину с hotfixом. Пока этот баг не исправлен, я предлагаю не скулить, а искать обходные пути решения. Если работа с курсорами жестко зашита в Ваших компонентах, а делать руками ничего не хочется, если Вы находите больший смысл в смаковании проблемы, нежели в ее разрешении (хотя бы частичном и неидеальном на данном этапе) - sorry, мой совет не для Вас, можете плакаться дальше.
Garya
Дата: 01.02.2001 15:04:57
Толи я невнятно объяснил суть вопроса, толи меня невнятно поняли. Суть вопроса состоит в следующем. Выявлены два неких бага. Необходимо определить причину их возникновения - либо виноваты кракоделы, либо MS. Если первое, то проблема устраняется установкой нормальной версии MS SQL-2000. Если второе, то проблема не устраняется вовсе (по крайней мере, до выхода SP, патчей e.t.c.).
Теперь по сути. Совершенно неожиданно для себя я нашел ответ на перечисленные вопросы. Мне подвернулась версия MS SQL Server-2000, в которой не проявляется ни первый, ни второй баг. Так что, решение сей проблемы сводится к установке сервера с нормального дистрибутива вкупе с клиентскими утилитами. Огорчает то, что ответ был найден НЕ на данной конференции.
Дед Маздай
Дата: 05.02.2001 00:05:18
Great! Так и запишем. MS вычеркивает ложную тревогу из списка bugs to fix in SP1. Если кто-нибудь еще начинает выступать по поводу этих граблей, растолковать оному, что сие не баг, но коряво крякнутый дистрибутив. При необходимости сослаться на А.Гордиенко (hydro@corbina.ru).
Garya
Дата: 06.02.2001 22:06:58
А нельзя ли ссылочку? Я полазил по сайту MS, но не обнаружил ни сообщения о BUG-е, ни SP1 для MS SQL SERVER-2000. Кстати, не вы ли пишите сервиспаки для MS ?
Дед Маздай
Дата: 07.02.2001 11:14:10
Можно. Летом. Во 2-й половине, я думаю.
Если я еще не совсем забыл русский, то "пишИте" - это призыв.