Как предотвратить или избежать выполнения операторов update update без предложений where в oracle - PullRequest
0 голосов
/ 19 февраля 2019

Как предотвратить или не запускать операторы update delete без предложений where в oracle?Пожалуйста, помогите с этим

1 Ответ

0 голосов
/ 20 февраля 2019

Это кажется неправильным поступком.Было бы лучше иметь некоторую комбинацию:

(A) отмены доступа от людей, которым нельзя доверять (B), предоставляющих доступ через уровень PL / SQL, который ограничит пользователей предопределенными операциями (C)Если для какой-либо катастрофической ошибки вы зададите для своей базы данных достаточно отката, откройте ее.

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

Вот пример:

-- Create a table we want to protect
drop table matt1;
create table matt1 ( a number );
-- Put some data into it
insert into matt1 
select level from dual connect by rownum <= 100;

commit;

-- Create an audit handler that will protect our table from wide-open updates
-- or deletes    
CREATE OR REPLACE PACKAGE matt_table_protector_pkg AS
  PROCEDURE table_protector ( schema_name VARCHAR2, table_Name VARCHAR2, policy_name VARCHAR2 );
END matt_table_protector_pkg;
/    

CREATE OR REPLACE PACKAGE BODY matt_table_protector_pkg AS

  PROCEDURE table_protector ( schema_name VARCHAR2, table_Name VARCHAR2, policy_name VARCHAR2 ) IS
    l_filter_count NUMBER;
  BEGIN
     EXECUTE IMMEDIATE 'EXPLAIN PLAN FOR ' || SYS_CONTEXT('USERENV','CURRENT_SQL');

     select count(*)
     into l_filter_count
     from table(dbms_xplan.display(format=>'PREDICATE'))
     where plan_table_output like '% - filter(%'
     and plan_table_output not like '%SYS_AUDIT(%';

     IF l_filter_count = 0 THEN
       raise_application_error(-20001, 'Unrestricted DML is not allowed on this table.');
     END IF;
  END;

END matt_table_protector_pkg;
/

Далее мы создадим детальную политику аудита, чтобы убедиться, что наш пакет вызывается при каждом обновлении илиудалить на нашем столе.

--EXEC DBMS_FGA.drop_policy (object_schema => user, object_name => 'MATT1', policy_name => 'PROTECT_MATT1');

EXEC DBMS_FGA.add_policy (object_schema     => user, object_name => 'MATT1', policy_name       => 'PROTECT_MATT1', audit_condition   => null, audit_column      => NULL, handler_schema    => user, handler_module    => 'MATT_TABLE_PROTECTOR_PKG.TABLE_PROTECTOR', enable            => TRUE, statement_types => 'UPDATE, DELETE');

Вот и все.Теперь вы в основном защищены.

select * from matt1;
100 rows selected
delete from matt1 where a = 7;
1 row deleted
delete from matt1;
ORA-28144: Failed to execute fine-grained audit handler
ORA-20001: Unrestricted DML is not allowed on this table.
ORA-06512: at "APPS.MATT_TABLE_PROTECTOR_PKG", line 15
ORA-06512: at line 1

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

delete from matt1 where 1=1;

или

delete from matt1 where 1<2;

Но это все еще легко обмануть.Например, этот оператор будет работать.

delete from matt1 where sysdate is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...