Как проверить конкретные данные во всей схеме

#oracle #plsql #oracle-sqldeveloper

#Oracle #plsql #oracle-sqldeveloper

Вопрос:

Возможно ли найти конкретные данные из всей схемы в sql developer. Мой поиск должен быть похож на опцию «Найти объект базы данных» в sql developer.

Комментарии:

1. Вы хотите найти скалярное значение в каждой строке каждой применимой таблицы в схеме?

2. @JeffHolt Да..

Ответ №1:

Возможно ли это? Конечно. Но это будет ужасно дорого в чем-либо, кроме игрушечной схемы.

Скорее всего, вам нужно будет использовать динамический SQL (вероятно, вы могли бы выполнить то же самое с помощью XML-запроса). Упрощенная реализация будет делать что-то вроде

 DECLARE
  l_search_string varchar2(1000) := 'foo';
  l_sql           varchar2(4000);
  l_cnt           integer;
BEGIN
  for c in (select *
              from user_tab_columns
             where data_type in ('CHAR', 'VARCHAR2'))
  loop
    l_sql := 'SELECT COUNT(*) FROM ' || c.table_name ||
             ' WHERE ' || c.column_name || ' = :1 ';
    EXECUTE IMMEDIATE l_sql
       INTO l_cnt
      USING l_search_string;

    IF( l_cnt > 0 )
    THEN
      dbms_output.put_line( l_search_string || ' found in column ' ||
                              c.column_name || ' in table ' ||
                              c.table_name );
    END IF;
  end loop;
END;
  

Вы могли бы сделать это более эффективным, создав один COUNT запрос для каждой таблицы, а не для каждого столбца, но это будет более сложным для построения. Вы могли бы выполнить аналогичный процесс для a l_search_number или a l_search_date для поиска числовых столбцов или столбцов даты. Вы могли бы сделать код более надежным, обрабатывая имена таблиц или столбцов с учетом регистра (здесь я избегаю двойных кавычек для простоты). И вы можете сделать что-то более полезное, чем запись результата в dbms_output .

Однако с точки зрения производительности вам придется читать практически каждую строку в каждой таблице базы данных, чтобы сделать это, что будет чрезвычайно медленно в большинстве реальных систем. Как правило, это также то, что не имеет особого смысла хотеть делать. Например, если вы ищете определенную строку, которая, как вы знаете, является именем человека, если ваша схема не разработана совершенно ужасно, вы почти наверняка можете просмотреть схему и определить несколько таблиц и столбцов, которые могут содержать имя человека. Не имеет смысла искать каждый столбец в каждой таблице на случай, если кто-то хранит имена в model столбце car таблицы.