Створення збереженої процедури та SQLite?


Відповіді:


217

SQLite повинен був пожертвувати іншими характеристиками, які деякі люди вважають корисними, такими як висока конкурентоспроможність, дрібнозернистий контроль доступу, багатий набір вбудованих функцій, зберігаються процедури , езотеричні функції мови SQL, розширення XML та / або Java, тера- або пета-байт масштабованість тощо

Джерело: Відповідне використання для SQLite


3
Ви можете використовувати еквівалент SQLite функцій SQL CLR для досягнення тієї самої мети ( stackoverflow.com/questions/172735/… ).
devinbost

@bostIT Дякую за доповнення. Посилання на System.Data.SQLite system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
h3xStream

91

Відповідь : НІ

Ось чому ... Я думаю, що ключовою причиною зберігання проектів у базі даних є те, що ви виконуєте код SP у тому ж процесі, що і двигун SQL. Це має сенс для двигунів баз даних, призначених для роботи в мережі, але імператив для SQLite набагато менше, враховуючи, що він працює як DLL у вашому процесі застосування, а не в окремому процесі роботи SQL. Тому має сенс реалізувати всю свою логіку бізнесу, включаючи те, що було б кодом SP на мові хоста.

Однак ви можете розширити SQLite за допомогою власних визначених користувачем функцій на мові хоста (PHP, Python, Perl, C #, Javascript , Ruby тощо). Потім ви можете використовувати ці спеціальні функції як частину будь-якого вибору / оновлення / вставки / видалення SQLite. Я робив це в C #, використовуючи SQLite DevArt для реалізації хешування паролів.


16
Для уточнення ... Я не кажу, що для впровадження SP в SQLite немає причин - просто набагато менше причин, ніж в інших двигунах БД.
Тоні О’Хаган

4
Ключова причина збереження процедур - запобігання від ін'єкції SQL. Однак є багато інших причин. Наприклад, можливість поділитися відповідними запитами, вбудувавши їх у файл sqlite. Не існує абсолютно різниці між стандартним запитом, що працює в контексті SQL Engine, і вибором SP. Вони обидва РАБОТИ на SQL ENGINE.
Dan

4
@Dan По-перше, SP існували задовго до того, як про ін'єкцію SQL навіть думали. Тисячі додатків на базі SQL побудовані без них, захищених від цієї атаки. Я також переглянув код незахищених SP, які є вразливими до ін'єкції SQL (як правило, засновані на динамічному SQL). Так що ні, я не знаю, це головна причина. Існує маса інших способів запобігти цій атаці ще вище стека.
Тоні О'Хаган

3
@Dan Більшість двигунів SQL - це клієнт / сервер (НЕ SQLite!). Для них ефективність є ключовим питанням при вирішенні питання про те, де розмістити бізнес-логіку. Виконання бізнес-логіки, будь то запит АБО інтерактивний АБО умовний код всередині SP в двигуні SQL, може (1) покращити ефективність пошуку даних, (2) знизити мережевий трафік (3) зменшити використання пам'яті рівня додатків (4) плани виконання кеш-запитів (попередньо складені СП). Більшість розробників додатків вважають за краще перемістити частину своєї бізнес-логіки поза механізмом SQL (очевидно, це не запити!). Для SQLite це менш важливо, оскільки він не підтримує клієнта / сервера.
Тоні О'Хаган

Спасибі, Тоні. Мені було цікаво, чому SQLite не має процедур, але має вбудовані функції ( sqlite.org/lang_corefunc.html )? Чи правильно, що для клієнтсько-серверних RDBMS, таких як postgresql, обидві функції та процедури зберігаються на стороні сервера? Оскільки SQLite безсерверний, якщо SQLite не має процедур, то з тієї ж причини він також не повинен мати функцій?
Тім

17

Якщо ви все ще зацікавлені, Кріс Вольф зробив прототип реалізації SQLite із збереженими процедурами. Докладні відомості можна знайти в його публікації в блозі: Додавання збережених процедур у SQLite


5
Стаття зараз мертва, але проект знаходиться на веб- сайті github.com/wolfch/sqlite-3.7.3.p1 . Файл readme означає, що це не готове виробництво, а також не для експериментів. Схоже, це більше доказ концепції.
pqsk

7

Тим не менш, можна підробити це за допомогою спеціальної таблиці, названої для вашого fake-sp, після ПІСЛЯ ВСТАВКИ. Виділені рядки таблиці містять параметри для вашої підробленої sp, і якщо вона потребує повернення результатів, ви можете мати другу (можливо, темп) таблицю (з назвою, пов'язаною з підробленою), щоб містити ці результати. Для цього знадобляться два запити: перший для ВСТАВЛЕННЯ даних у таблицю підроблених sp-тригерів, а другий для вибору SELECT із таблиці підроблених sp-результатів, яка може бути порожньою, або мати поле повідомлення, якщо щось пішло не так .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.