|
шапоклякистка 8-го дня
|
|
Хранимая процедура или табличная функция?28.08.2016, 12:37. Показов 4344. Ответов 14
Метки нет (Все метки)
Если мне нужно получить упорядоченую выборку, зависящую от двух параметров, и выборка эта потом будет использоваться в клиентском приложении в качестве источника строк поля со списком - то какой объект на сервере предпочтительнее создать: хранимую процедуру или табличную функцию?
Вообще, есть какие-то показания для однозначного выбора того или иного типа объекта? SQL Server я новичок, и у меня серьезые проблемы с тем, чтобы решить, объект какого типа наиболее подходящий для какой задачи. То есть, некоторые вещи я вроде бы понимаю: если мне нужна выборка, на основе которой делать форму, в которой можно обновлять, добавлять и удалять записи - то мне нужен View; если мне нужно дать команду выполнить какую-то манипуляцию (скажем, обновить, добавить, удалить и тп.) - то нужна ханимая процедура; а если мне нужно получить значение или набор данных, который я затем смогу использовать в других запросах - то функция. (буду благодарна за уточнения или поправки, если я неправа даже в этих трех критериях) А вот в случае, когда нужен просто набор данных - не для изменения, не для использования в запросах, без каких-либо манипуляций - вот тут я тереяюсь, какой тип объекта выбрать. Вью удалось отбросить благодаря наличию параметров и тому, что набор мне нужен отсортированный. Хранимка и табличная функция остались. По удобству использования в клиенте они мне одинаковы. Что выбрать? Добавлено через 44 минуты UPD: Вопрос для данного конкретного случая разрешился сам собой при попытке создать и хранимку, и функцию и попробовать их в использовании. Оказалось, что в функции, как и во вью, тоже нельзя использовать сортировку (почему-то я не уловила этот запрет при чтении учебника, а в предыдущие разы, когда были нужны функции - они были нужны как раз без сортировки). Но вопрос об общих критериях выбора в пользу того или иного объекта, в ситуациях, позволяющих несколько вариантов, остается в силе.
0
|
|
| 28.08.2016, 12:37 | |
|
Ответы с готовыми решениями:
14
Триггер или хранимая процедура для удаления? Хранимая процедура Хранимая процедура |
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 28.08.2016, 14:56 | |
|
Тема обширная и холиварная.
С точки зрения гибкости взаимодействия с клиентом - предпочитетльнее процедуры. Даже для модифицируемых источников данных, но это уже зависит от возможностей клиента. В вашем конкретном случае это проявится, например, если потребуется изменить критерий сортировки. В случае функции придется менять клиента со всеми вытекающими. В случае процедуры - только процедуру, причем работа пользователей не будет прервана.
1
|
|
|
шапоклякистка 8-го дня
|
|
| 28.08.2016, 19:29 [ТС] | |
|
0
|
|
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 28.08.2016, 19:45 | |
|
1
|
|
|
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
|
||||||
| 28.08.2016, 19:55 | ||||||
|
Более того, если СУБД поддерживает такое (знаю Оракл такое умеет с 9-й версии), то условные параметры (WHERE секция) для View подставляются в само представление как бы становясь его частью. Тем самым обеспечивается аналогичное табличной функции оптимизированное действие тем самым избавляя СУБД делать два запроса. А вот MS SQL так вроде не умеет. Хотя после 2005-й версии не вникала. Может и научили.
1
|
||||||
|
шапоклякистка 8-го дня
|
||
| 28.08.2016, 20:13 [ТС] | ||
|
Не, с формами на основе хранимок я пробовала - есть проблемы, связанные с разной сложностью разработки в случае вью и хранимки. Клиент у меня - проект .adp в аксес.
Юзеры уже пользовались аксесной базой и привыкли к встроенным средствам фильтрации и сортировки и хотят пользоваться ими дальше. Естсественно, аксесные фильтры с базой на сервере не работают, но у форм, основанных на вью, есть свойство "серверный фильтр", которому можно присвоить правильно сформированную строку и получить отфильтрованный результат. А строку я легко получаю, просто взяв строку, сформированную встроенным фильтром, и выполнив несколько несложных замен (скажем, символ подстановки не "*", а "%", кавычки не двойные, а одинарные, и т.п.) А вот если источником даых формы сделать хранимую проедуру - это свойство ("серверный фильтр") ни на что не влияет, посто игронируется и все. А к подвигу написания хранимки с числом параметров, охватывающем весь широчайший спектр возможностей, что и как могут захотеть отфильтровать пользователи + синтаксического анализатора строки - результата работы встроенного фильтра - для перевода фильтра пользователей в понятные хранимке параметры - я не готова абсолютно. Добавлено через 5 минут
0
|
||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 28.08.2016, 20:31 | |
|
1
|
|
|
шапоклякистка 8-го дня
|
||
| 28.08.2016, 20:44 [ТС] | ||
Пока не знаю, не приходило в голову попробовать ![]() Добавлено через 6 минут Попробовала. Все нормально, injection не проходит.
0
|
||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
||||||
| 28.08.2016, 20:45 | ||||||
|
texnik-san, кстати есть способ возвращать из инлайновой функции/представления отсортированный набор:
1
|
||||||
|
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
|
|||
| 28.08.2016, 20:46 | |||
|
Вообще конечно не стоит давать клиентам возможность формировать строку условий. В таких случаях, когда это все же необходимо набор делят на две части: 1) Получение всех данных, которые будут участвовать в динамической фильтрации 2) Фильтрование любым способом уже на стороне клиента, где SQL инъекции не страшны Опять таки зависит от задачи. Даже если клиенты хотят запрашивать по 100 различным критериям, все равно никто не мешает АБД прописать 100 View или функций, а клиенту их вызывать и даже комбинировать вызовы разных функций.
1
|
|||
|
шапоклякистка 8-го дня
|
|||
| 28.08.2016, 21:00 [ТС] | |||
|
Это очень похоже на фильтр в экселе, только местами еще гибче. Строка формируется самим аксесом и попадает в свойство формы "фильтр". Пользователи этого свойства напрямую никак не касаются; сервера это свойство не касается тоже. Из "фильтр" в "серверный фильтр" строку переношу я, программно. Что происходит дальше - как именно происходит фильтрация, на сервере или ее выполняет движок аксеса - я не знаю, и не знаю, где прочитать об этом. Но пока попытки инъекции через строку фильтра не дали результата.
0
|
|||
|
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
|
|||||||||||||||
| 29.08.2016, 03:19 | |||||||||||||||
0
|
|||||||||||||||
|
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
|
|||
| 29.08.2016, 10:27 | |||
|
Он сложнее описывается, но гибче.
1
|
|||
| 30.08.2016, 11:31 | |
|
0
|
|
|
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
|
||
| 30.08.2016, 13:35 | ||
|
Если получить курсор без лишних данных то ничего страшного не произойдет. А кстати по-моему и над курсором можно производить SQL операции вместо описания прохода в цикле. Или ошибаюсь?
0
|
||
| 30.08.2016, 13:35 | |
|
Помогаю со студенческими работами здесь
15
Хранимая процедура Хранимая процедура Хранимая процедура Хранимая процедура Хранимая процедура Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|