Грант на селект, конечно, самое адекватное решение.
Как вынужденная мера, можно попробовать анализировать введённый запрос и на основании результата передавать либо не передавать его СУБД.
Но я бы предложил обратную процедуру: конструировать запрос из имеющихся данных, введённых любым удобным способом, в том числе и парсингом исходного запроса. Главное, передавать СУБД не введённые извне данные, а специально сформированный запрос, в котором гарантированно не будет «неправильных» конструкций. А если таковые есть в исходном запросе, выдавать ошибку.