Как проверить, есть ли у таблицы определенные разрешения, прежде чем вставлять запись в таблицу? - PullRequest
0 голосов
/ 04 апреля 2019

Сценарий: у меня есть таблица конфигурации, которая включает в себя метаданные о таблицах журналов (например, Table_name, table_owner). Я хочу добавить триггер к этой таблице конфигурации, который по существу проверяет, имеет ли запись таблицы, которая должна быть вставлена, конкретное разрешение (удаление), если нет, то не позволяйте этому произойти. Как я могу пойти по этому поводу?

1 Ответ

0 голосов
/ 04 апреля 2019

Другой способ сделать это - забыть о триггерах, но использовать VIEW...WITH CHECK OPTION, чтобы контролировать, что никто не вставляет данные, которые они не должны.

Предположим, ваша таблица конфигурации выглядит следующим образом:

CREATE TABLE my_config 
  ( owner VARCHAR2(30) NOT NULL,
    table_name VARCHAR2(30) NOT NULL,
    other_stuff VARCHAR2(500),
    CONSTRAINT my_config_pk PRIMARY KEY ( owner, table_name ) );

Создание представления для обработки вставок

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

WITH CHECK OPTION гарантирует, что никто не может использовать представление для вставки или обновления данных, которые не удовлетворяют представлению.

CREATE VIEW my_config_ins_v
AS
SELECT * FROM my_config c
WHERE EXISTS ( SELECT 'user has delete privs'
               FROM   user_tab_privs p
               WHERE  p.owner = c.owner
               AND    p.grantee = user
               AND    p.table_name = c.table_name
               AND    p.privilege = 'DELETE' )
WITH CHECK OPTION;

Попробуйте это

INSERT INTO my_config_ins_v VALUES ('USER_1','TABLE_I_HAVE_ACCESS_TO', 'STUFF');
-- 1 row inserted.

INSERT INTO my_config_ins_v VALUES ('SYS','OBJ$', 'STUFF');
-- ORA-01402: view WITH CHECK OPTION where-clause violation

Естественно, чтобы это было эффективным, вы не можете

GRANT INSERT ON my_config TO anyone;  -- don't do this

Вместо того, чтобы:

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