Как преобразовать Oracle SQL в хранимую процедуру, которая должна перебирать некоторые таблицы, извлекающие определенное поле данных? - PullRequest
1 голос
/ 21 ноября 2008

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

SELECT
    info_field, data_field
FROM
    table_one
WHERE
    some_id = '<id>' -- I need this <id> to be the procedure's parameter
UNION ALL

SELECT
    info_field, data_field
FROM
    table_two
WHERE
    some_id = '<id>'
UNION ALL

SELECT
    info_field, data_field
FROM
    table_three
WHERE
    some_id = '<id>'
UNION ALL

...

Учитывая, что я не эксперт по SP, я не смог найти хорошее решение для циклического прохождения всех задействованных таблиц (12 приблизительно).

Любые идеи будут полезны. Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 21 ноября 2008

Если вы просто хотите ограничить доступ пользователей, вы можете создать представление и предоставить им выбор в представлении, но не в таблицах:

CREATE VIEW info_and_data AS
    SELECT info_field, data_field    
    FROM   table_one
    UNION ALL
    SELECT info_field, data_field    
    FROM   table_two
    UNION ALL
    SELECT info_field, data_field    
    FROM   table_three
    ...

Пользователи могут затем набрать:

SELECT info_field, data_field
FROM   info_and_data
WHERE  some_id = <id>
2 голосов
/ 21 ноября 2008

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

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

Если вы заранее не знаете, какую комбинацию столбцов может видеть пользователь, то вы можете использовать динамический sql: вы собираете SQL-статистику в хранимой процедуре на основе привилегий доступа вашего пользователя (посмотрите из какой-то другой таблицы, которую вы создаете для хранения этой информации), что означает, что вы включаете только нужные столбцы в часть SELECT вашего оператора. Посмотреть этот документ из Orace для получения дополнительной информации.

Если вы используете Oracle 10g, вам может показаться интересной статья Oracle . Он вводит тему Виртуальной частной базы данных, или сокращенно VPD, где вы можете скрыть определенные строки или столбцы или даже отдельные значения столбца в зависимости от того, кто обращается к таблице.

1 голос
/ 21 ноября 2008

Ожидается ли, что среди всех этих таблиц только одна будет соответствовать данному идентификатору?

Если нет: вам нужно объяснить, что вы хотите делать, когда есть несколько совпадений.

Если да: вы просто делаете тот же SQL-запрос, выбирая результат в переменную, которую затем возвращаете.

Это будет выглядеть примерно так:

PROCEDURE get_fields( the_id  NUMBER,
                      info_field_out  OUT  table_one.info_field%TYPE,
                      data_field_out  OUT  table_one.data_field%TYPE
                    )
  IS
  BEGIN
    SELECT info_field, data_field
      INTO info_field_out, data_field_out
      FROM (
        ... put your full SQL query here, using 'the_id' as the value to match against ..
      );

  EXCEPTION

    WHEN no_data_found THEN
      -- What do you want to do here?  Set the outputs to NULL?  Raise an error?

    WHEN too_many_rows THEN
      -- Is this an invalid condition?

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