Как сохранить переменные Alter Session Set только для определенной базы данных? - PullRequest
0 голосов
/ 08 ноября 2011

Я хочу изменить параметры NLS_SORT и NLS_COMP для каждого запроса к этой конкретной схеме, но есть и другие пользователи в этой системе, которые также хотят сохранить исходные значения, поэтому использование ALTER SYSTEM SET в этом нет, нет дело. Я также не хочу менять каждый запрос на эту конкретную схему.

Есть ли способ поместить эти значения в файл инициализации, относящийся только к этой схеме, или я могу каким-то образом добавить триггер, который устанавливает эти значения в сеансе всякий раз, когда сеанс запускается в этой схеме?

Я использую Oracle Express 11G R2, и решение не требует обратной совместимости.

Моя цель состоит в том, чтобы не запускать строки ALTER SESSION SET перед выполнением оператора SELECT-LIKE и заставить его давать два результата, а не один. Вот пример кода Java, который я использовал, чтобы проверить, какие значения я действительно хочу, чтобы значения NLS_COMP и NLS_SORT имели:

public class OracleCaseTest {
    public static void main(String[] args) throws SQLException {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
        dataSource.setUsername("CASETEST");
        dataSource.setPassword("casetest");

        Connection conn = null;
        PreparedStatement createStatement = null;
        PreparedStatement populateStatement = null;
        PreparedStatement comparisonAlterSessionStatement = null;
        PreparedStatement sortAlterSessionStatement = null;
        PreparedStatement queryStatement = null;
        PreparedStatement deleteStatement = null;
        ResultSet rs = null;

        conn = dataSource.getConnection();

        createStatement = conn
                .prepareStatement("CREATE TABLE CollationTestTable ( Name varchar(255) )");
        createStatement.execute();

        try {
//            comparisonAlterSessionStatement = conn
//                    .prepareStatement("ALTER SESSION SET NLS_COMP=LINGUISTIC");
//            comparisonAlterSessionStatement.execute();
//
//            sortAlterSessionStatement = conn.prepareStatement("ALTER SESSION SET NLS_SORT=BINARY_CI");
//            sortAlterSessionStatement.execute();

            String[] names = { "pepe", "pépé", "PEPE", "MEME", "mémé", "meme" };
            for (String name : names) {
                populateStatement = conn
                        .prepareStatement("INSERT INTO CollationTestTable VALUES (?)");
                populateStatement.setString(1, name);
                populateStatement.execute();
            }

            queryStatement = conn
                    .prepareStatement("SELECT Name FROM CollationTestTable WHERE NAME LIKE 'pe%'");
            rs = queryStatement.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString(1));
            }
        } finally {

            deleteStatement = conn.prepareStatement("DROP TABLE CollationTestTable");
            deleteStatement.execute();
        }
    }
}

Мне известна проблема с полным сканированием таблиц без лингвистических индексов, которую это может создать, но проигнорируйте ее для этого вопроса.

ОБНОВЛЕНИЕ: Это заявление, которое я использовал для создания своего триггера из интерфейса командной строки SQL (после подключения и входа в систему с моим пользователем):

create or replace trigger nls_settings 
after logon on schema 
begin 
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC'; 
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI'; 
end nls_settings; 
/ 

Также изменил исходный вопрос, чтобы указать, что под «базой данных» в мире Oracle я действительно имел в виду «схема» / «пользователь».

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

Вы можете создать триггер при

  • запуске базы данных или завершении работы экземпляра
  • входе или выходе пользователя из системы

http://download.oracle.com/docs/cd/B14117_01/server.101/b10743/triggers.htm#i6061

1 голос
/ 08 ноября 2011

Прежде всего, вы можете уточнить, что вы подразумеваете под "базой данных"?В терминологии Oracle база данных - это набор схем, которые будут затронуты вызовом ALTER SYSTEM.На одном сервере может быть несколько баз данных, но на компьютере может быть только одна база данных XE.Если вы исходите из SQL Server, то, что SQL Server называет «базой данных», больше похоже на то, что Oracle называет «схемой».

Предполагая, что вы действительно имеете в виду схему, а не базу данных, и предполагая,Пользователь Oracle CASETEST взаимодействует только с таблицами в одной схеме, я хотел бы предложить bpgergo триггер входа в систему в схеме CASETEST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...