Как предоставить триггерный доступ к таблице - PullRequest
0 голосов
/ 18 января 2019

Я получаю сообщение об ошибке для успешно созданного триггера.

Я пытался ...

GRANT SELECT ON OTHER_TABLE TO [me];
call SYS.DBA_ASSIST.GRANT_OBJ_PERMS('dbo.MYTABLE','SELECT','dbo.OTHER_TABLE');`

Вот код для триггера ...

  CREATE OR REPLACE TRIGGER PREVENT_INVALID_ID
  BEFORE INSERT OR UPDATE ON dbo.MYTABLE
  FOR EACH ROW
  DECLARE ROW_COUNT NUMBER;
  BEGIN
  SELECT COUNT(*) INTO ROW_COUNT 
         FROM [OTHER_TABLE] WHERE OTHER_TABLE_ID = :new.MYTABLE_ID;
  IF ROW_COUNT = 0 THEN
    RAISE_APPLICATION_ERROR(-20101, 'The ID provided is invalid.');
    END IF;
  END;`

Сообщение об ошибке в user_errors гласит: "PL / SQL: ORA-00942: таблица или представление не существует"

Screen shot

Есть идеи, как получить триггер для доступа к OTHER_TABLE?

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

Заранее спасибо, Josh

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Разобрался: GRANT SELECT ON OTHER_TABLE TO dbo

Что меня оттолкнуло, так это использование слова «владелец стола», когда я искал инструкции о том, как это сделать. Я думал, что я был владельцем стола. Скорее, это схема (dbo), которая требует привилегий.

0 голосов
/ 18 января 2019

Если MYTABLE и OTHER_TABLE принадлежат одному и тому же пользователю, никаких привилегий не требуется:

SQL> show user
USER is "SCOTT"
SQL> create table other_table (other_Table_id number);

Table created.

SQL> create table mytable (mytable_id number);

Table created.

SQL> create or replace trigger prevent_invalid_id
  2    before insert or update on mytable
  3    for each row
  4  declare
  5    row_count number;
  6  begin
  7    select count(*) into row_count
  8    from other_table where other_table_id = :new.mytable_id;
  9
 10    if row_count = 0 then
 11       raise_application_error(-20101, 'The ID provided is invalid');
 12    end if;
 13  end;
 14  /

Trigger created.

SQL>

Однако, если они принадлежат другому пользователю, то владелец OTHER_TABLE должен предоставить SELECT привилегию me . Однако этого недостаточно - вы должны либо предшествовать OTHER_TABLE с именем владельца (например, other_user.other_table), либо создать синоним в моей собственной схеме, который указывает на OTHER_TABLE другого пользователя. Например:

SQL> drop table other_table;

Table dropped.

SQL> connect mike/lion@xe
Connected.
SQL> create table other_table (other_Table_id number);

Table created.

SQL> grant select on other_table to scott;

Grant succeeded.

SQL> connect scott/tiger@xe
Connected.
SQL> create or replace trigger prevent_invalid_id
  2    before insert or update on mytable
  3    for each row
  4  declare
  5    row_count number;
  6  begin
  7    select count(*) into row_count
  8    from MIKE.other_table where other_table_id = :new.mytable_id;
  9
 10    if row_count = 0 then
 11       raise_application_error(-20101, 'The ID provided is invalid');
 12    end if;
 13  end;
 14  /

Trigger created.

SQL>

Примечание строка 8: MIKE.other_table.

Просто чтобы показать, что произойдет, если вы опустите / удалите имя владельца:

SQL> l8
  8*   from MIKE.other_table where other_table_id = :new.mytable_id;
SQL> c/mike.//
  8*   from other_table where other_table_id = :new.mytable_id;
SQL> l
  1  create or replace trigger prevent_invalid_id
  2    before insert or update on mytable
  3    for each row
  4  declare
  5    row_count number;
  6  begin
  7    select count(*) into row_count
  8    from other_table where other_table_id = :new.mytable_id;
  9
 10    if row_count = 0 then
 11       raise_application_error(-20101, 'The ID provided is invalid');
 12    end if;
 13* end;
SQL> /

Warning: Trigger created with compilation errors.

SQL> show err
Errors for TRIGGER PREVENT_INVALID_ID:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3      PL/SQL: SQL Statement ignored
5/8      PL/SQL: ORA-00942: table or view does not exist
SQL>

См? ORA-00942.

...