Проверка разрешения доступа

Функция

Проверка разрешения доступа.

Спецификация
 
< имя пользователя >::=
< идентификатор таблицы >::=
Синтаксические правила

Примечания

  1. < Идентификатор таблицы > – внутренний системный номер таблицы в БД. Идентификаторы таблиц хранятся в системной таблице $$$SYSRL в столбце с именем $$$S11, имена таблиц – в столбце $$$S13. Таким образом, для получения < идентификатора таблицы > уникальной в БД таблицы AUTO можно использовать запрос:

    select $$$S11 from $$$SYSRL where $$$S13='AUTO';
  2. Если в БД имеются таблицы c одинаковыми именами (разные схемы), необходимо использовать имя схемы таблицы. Список схем хранится в системной таблице $$$USR, столбец $$$S34.

    select $$$S11 from $$$SYSRL, $$$USR
     where $$$s31  >0 and $$$s31=$$$s12
       and $$$S13='AUTO' and $$$s34='SYSTEM';
  1. Аргументы могут быть заданы < SQL-параметром >, который должен содержать спецификацию типа данных параметра.

    select access(? (CHAR(6)), ? (int));
    SYSTEM
    176
    |   SIDUAXR   |
  2. < Целочисленный литерал > должен иметь положительное значение, при прочих значениях результат функции будет NULL.

Возвращаемое значение
  1. Строка длиной 7 символов типа CHAR, содержащая коды доступных операций ('SIDUAXR' – SELECT, INSERT, DELETE, UPDATE, ALTER TABLE, CREATE INDEX, REFERENCES соответственно). Если операция недоступна, в соответствующей позиции строки ответа будет стоять пробел.

  2. Если один из параметров имеет NULL-значение, то результат будет NULL-значение.

Примеры
  1. username SYSTEM/MANAGER8
    create or replace user TEST identified by '12345678';
    grant dba to TEST;
    
    username TEST/12345678
    create or replace table tst_acs (i int);
    
    username SYSTEM/MANAGER8
    select $$$S11 from $$$SYSRL where $$$S13='TST_ACS';
    |    412|
    
    username TEST/12345678
    select access('SYSTEM', 412);
    |       |
    
    grant update on TST_ACS to SYSTEM;
    select access('SYSTEM', 412);
    |  U    |
    
    revoke update on TST_ACS from SYSTEM;
    select access('SYSTEM',412);
    |       |
  2. Получить список прав доступа на таблицу «Банки» пользователя «Петрова»:

    select ACCESS($$$S34,$$$S11) from $$$SYSRL,$$$USR
     where $$$S12=$$$S31 
       and $$$S34='Петров' and $$$S13='Банки';
  3. Выдать таблицы, для работы с которыми у текущего пользователя есть хотя-бы одна разрешенная операция:

    SELECT $$$S34 ,$$$S13
      FROM $$$SYSRL,$$$USR
     WHERE $$$S12 =$$$S31
       AND $$$S32 =0 AND ACCESS(USER,$$$S11) <  > ' ';