Czy zapisywanie instrukcji SQL w tabeli MySQL do późniejszego wykonania jest złym pomysłem? Instrukcje SQL będą gotowe do wykonania, tzn. Na przykład nie będzie żadnych parametrów do zamiany ani nic DELETE FROM users WHERE id=1
.
Chyba jestem leniwy, ale pomyślałem o tym, ponieważ pracuję nad projektem, który będzie wymagał sporo zadań cron, które będą okresowo wykonywać instrukcje SQL.
Odpowiedzi:
Jest bezpieczny, jeśli o to pytasz. Tak długo, jak dbasz o swoje bezpieczeństwo, tak samo jak o bezpieczeństwo swoich danych.
Ale nie wymyślaj na nowo koła, Procedury składowane TO fragmenty SQL przechowywane w tabeli. I wspierają, nie zachęcają, parametryzację.
Pamiętaj też, że możesz uprościć swoje bezpieczeństwo ORAZ zmniejszyć liczbę punktów awarii ORAZ zmniejszyć komunikację sieciową, używając Harmonogramu zdarzeń MySql zamiast crona.
Inne bazy danych mają te odpowiedniki, nie bez powodu. Nie jesteś pierwszym, który potrzebuje tej funkcjonalności.
źródło
Jeśli chcesz zapisać instrukcje SQL w bazie danych do późniejszego wykonania, istnieje lepsza opcja niż umieszczenie ich w tabeli: skorzystaj z wbudowanej funkcjonalności przewidzianej do tego konkretnego celu. Umieść je w procedurach przechowywanych.
źródło
Nie, powiedziałbym, że to nie jest dobry pomysł.
Oznacza to, że każde „prawdziwe” zapytanie / aktualizacja będzie wymagało 2 trafień w bazie danych - jednego, aby uzyskać „prawdziwe” zapytanie / aktualizację, i jednego, aby je wykonać.
Może to nie być poważny problem w małym systemie, ale im więcej użytkowników / transakcji uzyska system, tym mniej będzie się skalować.
Zgaduję, że wynika to z szukania alternatywy dla osadzenia SQL w kodzie?
Hermetyzowanie SQL w procedurze przechowywanej, jak sugerował Mason Wheeler, byłoby jednym ze sposobów, który byłby o wiele lepszy niż ten pomysł.
źródło
Niestety nie sądzę, że to dobry pomysł.
Rozważ przypadek, w którym zmienia się przedmiotowa tabela. Powiedzmy, że nazwa twojego identyfikatora zmienia się na new_id .
Oprócz samej zmiany istnieje wersja kodu napisana dla starego rocznika bazy danych, który może już nie działać. Pewnie, możesz wiedzieć, aby sprawdzić w tabeli kodów, ale nie jest to od razu oczywiste dla kogoś innego.
W przypadku zmiany, którą opisałem, zwykle patrzę na samodzielne pliki SQL, procedury składowane, wyzwalacze, wbudowany SQL w kodzie klienta (VB, C #, C ++ itp.), Ale ostatnie miejsce, w którym chciałbym szukać znajduje się w tabelach bazy danych. Chociaż może teraz to zrobię! :)
źródło
Istnieją ważne powody, aby przechowywać SQL w tabeli. Oprogramowanie, z którym pracuję w pracy, obejmuje teraz system generowania dokumentów, a dokumenty muszą zawierać dość złożone obliczenia z wykorzystaniem danych w bazie danych. Dokumenty są często aktualizowane, często różnią się znacznie pod względem potrzebnych danych i obliczeń, które należy wykonać. SQL jest zasadniczo używany jako język skryptowy do wykonywania tych obliczeń, a SQL jest przechowywany w tabelach, które przechowują również inne informacje dla tych dokumentów. Osoby obsługujące te dokumenty nie są programistami ani DBA, ale znają schemat bazy danych i biegle posługują się językiem SQL. Utrzymanie tego kodu SQL w postaci procedur przechowywanych byłoby dużym obciążeniem.
W przypadku tego, co opisałeś - „... projekt, który będzie wymagał sporo zadań cron, które będą okresowo wykonywać instrukcje SQL” - inne odpowiedzi prawdopodobnie są poprawne, sugerując, że używałeś procedur przechowywania lub równoważnych dla DBMS, który „ ponownie używam.
Dobrym kryterium decydującym o tym, czy rozsądnie jest przechowywać SQL w tabeli czy w procedurze przechowywanej, jest ustalenie, kto będzie utrzymywał ten SQL. Jeśli użytkownicy utrzymują ten SQL, tzn. Piszą go i zmieniają, kiedy tylko chcą, wówczas może być idealnie, a najlepiej najlepiej, przechowywać ten SQL w tabeli. Jeśli programiści będą utrzymywać ten SQL, powinien on być przechowywany w formie, która może być aktualizowana przez (miejmy nadzieję zautomatyzowane) procedury kompilacji i wdrażania, np. Przechowywany jako obiekt taki jak procedura przechowywana w samej bazie danych.
źródło
Najłatwiejszym wyjściem byłoby posiadanie pliku .ini lub innego pliku konfiguracyjnego do przechowywania zapytań. W ten sposób możesz mieć je w jednym miejscu, zmieniać wszystko bez konieczności dostępu do bazy danych, aby to zrobić, nie uderzać bazy danych wiele razy a także możesz chcieć / potrzebować w pewnym momencie użyć parametrów lub dodać warunki do swoich zapytań (rozszerz je o bardziej złożone rzeczy dla konkretnego przypadku w kodzie).
Oczywiście możesz trzymać je na poziomie bazy danych (albo w tabeli, albo jeszcze lepiej, jako procedury składowane), jednak jeśli jesteś tak leniwy jak ja ;-), ale martwisz się również wydajnością, plikiem .ini i PHP ukochana metoda parse_ini , aby ją przeczytać, to droga do wyjścia (jeśli wybierasz inny język programowania, sam zastanawiasz się nad podobnymi podejściami)! Zwykle czytałem ten plik w bootloaderze aplikacji i trzymałem go w obiekcie statycznym (być może z warstwą pamięci podręcznej na wierzchu), aby naprawdę przyspieszyć, jeśli mówimy o bardzo dużej liczbie różnych zapytań.
źródło
Jeśli potrzebujesz instrukcji SQL tylko raz, na przykład, jeśli ustawisz w kolejce kilka operacji do wykonania poza godzinami pracy, to tak, umieszczenie ich w tabeli będzie działać dobrze.
Jeśli musisz wykonywać tę samą instrukcję SQL w określonych odstępach czasu, trasa procedury składowanej, o której wspominali inni, jest prawdopodobnie lepszym wyborem dla Ciebie.
To powiedziawszy, o co pytasz, jest dość niezwykłe i może wskazywać na jakiś inny problem. Na przykład, jeśli czekasz na usunięcie użytkownika z bazy danych, lepiej może wywołać zaplanowany skrypt, który wykonuje operację za pomocą kodu aplikacji, niż rejestrować rzeczywiste instrukcje SQL. W ten sposób SQL i kod nigdy nie są zsynchronizowane.
źródło