Zapytania do bazy wykonujemy jako zapytania parametryczne z użyciem funkcji sqlPrepare() i sqlExecute() pakietu RODBCext.
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ć.
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)) ... }
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) )