2013-11-29 4 views
1

по многим причинам, мы защищаем нашу Интеллектуальную собственность на ее самом большом, и мы уже запутываем и обертываем нашу логику. Все работает нормально.Скрыть sql с точки зрения

У нас есть забота о мнениях. В некоторых случаях мы предоставляем нашим клиентам некоторые мнения, исходя из их конкретных потребностей. Таким образом, мы можем предложить им правильные результаты. В противном случае они иногда пытаются создать свой собственный sql, и они получают неправильные ответы.

Возможно ли заполнить материализованное представление на основе пакета или процедуры? Я понимаю, что только функция может что-то возвращать, но я, возможно, что-то упускаю. Моя фактическая альтернатива - заполнить таблицу с помощью процедуры, но мне это неудобно.

Мы на самом деле с помощью Oracle 11

Любая идея приветствуется. Благодаря!

+0

Я думаю, что это нормально, когда поставщик защищает свой код и завершает пакеты и процедуры. Но содержание данных в основном принадлежит клиенту, поэтому он должен уметь его видеть. Я предполагаю, что база данных размещена самим клиентом, там у вас также есть администратор базы данных и администратора SYS. В любом случае, они могут читать каждую таблицу/просмотр, поэтому будет сложно скрыть данные от них. –

+1

Нет, вы не можете буквально (используя утилиту обложек) обернуть исходный текст представления. Утилита wrap завершает только исходный текст PL/SQL (за исключением анонимного блока PL/SQL и триггеров). Технически вы можете скрыть этот оператор select, поместив его в конвейерную функцию, оберните эту функцию и затем создайте представление, основанное на этой конвейерной функции. Но это будет ужасно медленным и станет еще медленнее, поскольку сложность запроса и количество извлеченных данных будут возрастать. –

+0

Да, это их данные, но это сложная система. Цель состоит в том, чтобы предоставить им правильные данные и защитить наш IP-адрес. Благодарю. (и я не понимаю, почему я получаю -1 на этом) –

ответ

0

Вы можете предоставить функцию, которая возвращает вложенную таблицу.

CREATE TABLE SECRET_TABLE (col_1 NUMBER, col_2 VARCHAR2(10)); 
CREATE OR REPLACE TYPE t_secret_table_rec AS OBJECT (col_1 NUMBER, col_2 VARCHAR2(10)); 
CREATE OR REPLACE TYPE t_secret_table AS TABLE OF t_secret_table_rec; 

CREATE OR REPLACE FUNCTION GetData RETURN t_secret_table AS 
    res t_secret_table; 
BEGIN 
    -- Wrap this function 
    SELECT t_secret_table_rec(col_1, col_2) 
    BULK COLLECT INTO res 
    FROM SECRET_TABLE; 
    RETURN res; 
END; 

Затем вы можете выбрать данные, как это:

SELECT * FROM TABLE(GetData); 

Однако, это совсем немного усилий, и вы можете столкнуться с некоторыми проблемами в отношении производительности.

+0

Спасибо. Я уже что-то читал, но это было неясно. Теперь я получаю это благодаря. Извините, если я не могу проголосовать, у меня все еще есть репутация 0. ;-) Еще раз спасибо –

+1

Обратите внимание: защита очень низкая **, вы можете обойти ее просто следующим образом: 'ALTER SESSION SET sql_trace = true ; SELECT * FROM TABLE (GetData); ALTER SESSION SET sql_trace = false; 'Тогда вы найдете инструкцию Select в файле трассировки без каких-либо проблем. –

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