Narzędzia użytkownika

Narzędzia witryny


ewdsql

Zasady wykonywania zapytań SQL

1. Używamy zapytań parametrycznych

Zapytania do bazy wykonujemy jako zapytania parametryczne z użyciem funkcji sqlPrepare() i sqlExecute() pakietu RODBCext.

  • Pakiet RODBCext dostępny jest na githubie https://github.com/zozlak/RODBCext, tam też znajduje się instrukcja instalacji.
  • Sposób korzystania z funkcji sqlPrepare() i sqlExecute() opisano w dokumentacji pakietu.
  • Dlaczego tak - patrz omówienie niżej.

Omówienie

Zwykły użytkownik nie jest w stanie w bazie nic popsuć, bowiem nie ma praw do zapisu, aktualizacji ani usuwania czegokolwiek.

Nie oznacza to jednak, że nie należy zwracać uwagi na zabezpieczanie pisanego kodu przed SQL injections.

Ponieważ pakiet RODBC nie umożliwia wykonywania zapytań parametrycznych (gdzie parametry zapytania są oddzielone od jego treści, a więc nie da się zmienić treści zapytania za pomocą jego parametrów), stworzone zostało jego rozszerzenie RODBCext, które udostępnia stosowne funkcje i należy z niego korzystać.

2. Dbamy o poprawne zakończenie połączenia

Jeśli funkcja operująca na bazie danych sama otwiera połączenie z bazą, powinna też zadbać o jego zamknięcie. Także wtedy, jeśli w trakcie jej wywołania nastąpi błąd. Aby to osiągnąć, wystarczy zastosować funkcję on.exit():

moja_funkcja = function(...){
  P = odbcConnect('mojeZrodloODBC')
  on.exit(odbcClose(P))
  ...
}

3. Przy zapisie do bazy korzystamy z transakcji

Jeśli funkcja modyfikuje bazę danych, powinna to robić w transakcji. W takim wypadku wystąpienie błędu podczas działania funkcji spowoduje, że baza wróci do stanu sprzed jej wywołania i nie trzeba będzie cofać tej części zapytań, które zdołały wykonać się przed wystąpieniem błędu. Aby to osiągnąć stosujemy funkcje odbcSetAutoCommit() oraz odbcEndTran():

TryCatch(
  {
    P = odbcConnect(zrodloDanychODBC)

    odbcSetAutoCommit(P, FALSE) # rozpocznij transakcję

    kod modyfikujący bazę
    
    odbcEndTran(P, TRUE) # zatwierdzamy transakcję
  },
  error = stop,
  finally = odbcClose(P)
)
ewdsql.txt · ostatnio zmienione: 2015/09/06 23:20 przez t.zoltak