Задать тип данных LONG с помощью подготовленного оператора - PullRequest
1 голос
/ 09 декабря 2011

Моя ситуация такова, что мне нужно создавать разделы БД на лету в определенное время. Я использую Statement, как показано ниже:

alter table table_name split partition default_partition values (' +
id + ') into (  partition " + partitionName + ", partition
default_partition) update indexes

Это прекрасно работает и делает именно то, что я ожидаю. Однако значение id исходит от ввода, к которому потенциально может получить доступ неавторизованный человек. Таким образом, вышеприведенный оператор уязвим для атаки SQL-инъекцией . Я хотел бы использовать PreparedStatement, но не могу понять, как.

Проблема в том, что таблица разделов в oracle помещает значение "id" в столбец HIGH_VALUE, который является LONG. Я не вижу подходящего сеттера для этого (поскольку String не может работать). Я попытался использовать различные потоковые сообщения с StringReader и ByteArrayInputStream в качестве значения, но безрезультатно. Я знаю, что LONG больше не должны использоваться, но у Oracle это так, поэтому я не могу обойти это.

Когда я пытаюсь любым из этих способов, вот что я получаю:

ORA-14308: partition bound element must be one of: string, datetime or interval literal, number, or NULL

В документации Oracle есть хорошая информация о том, как получить LONG (тип данных оракула, который похож на LOB), но не о том, как его установить. Может ли кто-нибудь помочь мне с этим? Я также изучил реализацию Oracle драйвера JDBC, но, похоже, у него тоже нет метода типа setLONG. Есть ли способ, которым я могу это сделать?

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

Нельзя использовать переменные связывания с DDL. Вы не сможете использовать PreparedStatement и вызывать любые методы setXXXX в своем выражении DDL.

Разделение разделов на лету на основе пользовательского ввода, по крайней мере, очень необычный дизайн. Я склонен подозревать, что вам лучше использовать что-то вроде интервальное разбиение , где Oracle заботится о создании новых разделов, когда они необходимы, или хэш-разделении, а не разделении по диапазонам. Предполагая, что действительно имеет смысл вручную создавать новые разделы на лету, однако, вам придется написать код, чтобы проверить, что значения 'id' и 'partitionName' являются допустимыми, чтобы предотвратить внедрение SQL.

0 голосов
/ 09 декабря 2011

Является ли id строкой, если так, почему бы вам не подтвердить ее раньше?

    try {
        id = Long.valueOf(unsafeId);
        //do more validations here
    } catch (NumberFormatException e) {
        throw new RuntimeException("Not a valid input.");
    }
...