2008-11-21 4 views
1

мне нужно преобразовать оператор Oracle SQL в хранимую процедуру поэтому пользователи с меньшими привилегиями могут получить доступ к определенной области данных:Как преобразовать 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 aprox.).

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

ответ

4

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

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> 
+0

Спасибо! Это было довольно информативно. – 2008-11-21 17:25:38

1

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

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

Если да: вы просто выполняете один и тот же запрос 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; 
+0

Большое спасибо за ответ! Я думаю, что на самом деле мне нужно иметь несколько результатов, поэтому в этом случае лучшим решением будет просмотр вместо этого. Как вы думаете? – 2008-11-21 17:08:56

+0

Если представление выполнит то, что вам нужно, то это более простое решение. Если нет, вы можете настроить технику, которую я показал, для извлечения и возврата нескольких строк. – 2008-11-24 13:47:18

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^