Что лучше ref cursor или select ?

ale-Just
Дата: 10.08.2005 19:23:42
Я придерживаюсь того, что выборка на клиент возвращается select ..., однако часто говорят о безопасности которая достигается путём передачи выборки через процедуру ref cursor-ом.Но в документации пишут что выборка ref cursor-ом наихудший метод передачи данных на клиента, так как каждое считывание записи это обращение к серверу , а в обычном select этого не наблюдается. Если я не прав то поправьте.Как протестировать и доказать тоже было бы интересно.
Заранее спасибо.
Sergey Balter
Дата: 10.08.2005 19:33:45
автор
безопасности которая достигается путём передачи выборки через процедуру


Рвать гланды через ж... адницу - лучший способ избежать инфекции в ротовой полости...
ale-Just
Дата: 10.08.2005 19:41:21
Но именно от этой идеи просто "визжит" начальство, а я должен доказать что это ошибка и для Oracle это не правильно.
stdio
Дата: 10.08.2005 19:45:14
ale-Just
Но именно от этой идеи просто "визжит" начальство, а я должен доказать что это ошибка и для Oracle это не правильно.
Делай тесты и доказывай цифрами
Sergey Balter
Дата: 10.08.2005 19:46:10
Идея свежая. :-)

Чтобы что-то доказать, нужно хотя бы знать цепь рассуждений, логику.
Чем ref cursor обеспечивает безопасность?
Лично для меня это не очевидно.
Владимир Бегун
Дата: 10.08.2005 20:27:58
Sergey Balter
Лично для меня это не очевидно.

Видимо, стоит почитать о системе безопасности в документации?

Логика в том что клиент "не видит" таблиц/представлений, единственный
способ получить доступ к данным -- вызов функции/процедуры, которая
вернёт ref cursor.
Владимир Бегун
Дата: 10.08.2005 20:49:48
ale-Just
что быстрее

А важно ли это? Я имею в виду, насколько критична скорость выборки
(так как ты её описал -- когда на клиента нужно выбираеть миллионы
строк данных?) vs. безопасность? Возможно, начальство отстаивает
то, что более критично для бизнеса.

Что быстрее проверяется просто -- берётся клиент (OCI/perl), делается
выборка и вызов функции/процедуры, возвращающей refcursor. делается
это всё N, из M сессий, выборка делается, скажем на 100000 записей.
Всё трассируется и смотрится время затраченное на PARSE/FETCH,
статисткиа -- если ты только это хотел проверить.
ale-Just
Дата: 10.08.2005 22:25:18
Владимир Бегун прав - этот довод у них главный.Но вот с доказательствами у меня проблемы(что быстрее).
softwarer
Дата: 10.08.2005 22:29:57
ale-Just
Но именно от этой идеи просто "визжит" начальство, а я должен доказать что это ошибка и для Oracle это не правильно.

Это не то что "ошибка", "правильно" или "неправильно". По большому счету это безразлично. Через процедуры можно реализовать нормальную систему безопасности. Ту же систему безопасности можно реализовать без процедур. Между различными подходами есть.. назовем так, технические отличия, и лично я полагаю разумным применять то, что наиболее подходит в данном конкретном случае.

На практике оказывается, что "визжащие" от данной идеи часто предполагают, что набор автосгенерированных процедур типа SelectById, SelectAll, Insert, Update, Delete правильнее, нежели прямой доступ к таблице. Я пару раз пробовал копнуть глубже - оказывалось, что они так считают, потому что "все говорят" или "везде написано", или еще что-нибудь столь же интересное. Это, разумеется, не значит, что процедуры хуже других подходов.

По моим недоказуемым ощущениям, истерика вокруг процедурного метода сложилась по двум причинам: во-первых, из-за недостаточных или недостаточно хороших инструментов контроля доступа в различных серверах БД (которые породили желание явно, кодом управлять доступом), а во-вторых из-за того, что набиравший тогда обороты MSSQL 2000 был оптимизирован именно в части работы хранимок (здесь я опираюсь на разговоры с mssql-евцами - в частности, как они говорят, при передаче sql-я с клиента отсутствует понятие bind variables как таковых).
vadiminfo
Дата: 10.08.2005 23:54:30
ale-Just

однако часто говорят о безопасности которая достигается путём передачи выборки через процедуру ref cursor-ом.

Разве в безопасности главная причина? Все-таки имеет значение где сам select на сервере или клинте. Если он на сервере, то легче разрабатывать, сопровождать систему. Одно дело править, настраивать их на сервере, другое на клиенте. Возможно, во многих случаях исправить на сервере без исправления клиентов. Тем более это можно делать удаленно. Если даже нет удаленного доступа, чтобы самом исправить где-то в N-ске, послал по аське исправленную процедуру админу, и дело сделано. А клинентов переставлять? Эта процедура может подходить в общем случае для разных типов приложений. Вызов ф-ии дешевле посылки на сервер текста select.
Селекты лучше писать и править проггерам БД, чем проггерам клиентов (специализация). Это выглядит как лучшая структуризация всего приложения.
А что касается производительности, то стоит, конечно проверить. Обычно на клиента идет небольшой объем. А при большем все равно все медленно.