У клиента есть потребность, таблица из более чем 150 полей, клиенту нужно, чтобы видели только некоторые поля сотрудникам сканирующей компании, это требование легко реализовать с помощью просмотра, клиент также запрашивает эти поля, компания может изменять только отдельные поля, я раньше не сталкивался с такой необходимостью в контроле разрешений на уровне столбцов, я провёл эксперимент, мне очень интересно, запишите его.
У клиента есть такойСпрос, стол с более чем 150 полями, клиент попросил показать только некоторые поля тем, кто сканировал компанию, этоСпросЭто легко реализовать с просмотром, и клиент просит, чтобы эти поля могли менять только отдельные поля, я раньше не сталкивался с такой необходимостью в контроле разрешений на уровне столбцов, я провёл эксперимент, мне очень интересно, запишите этоТестпроцесс. 1. Создайте тестовую таблицу и вставьте тестовые данные точек: SQL> создать table test (ID number,table_name varchar2(50), владелец varchar2(50),TABLESPACE_NAME varchar2(50)); Таблица создана. SQL> вставить в тест выбор rownum,table_name,owner, TABLESPACE_NAME из dba_tables; Создано 5490 строк. SQL> коммит; Коммит выполнен. 2. Создайте тестового пользователя и предоставите базовые права: SQL> CONN / AS SYSDBA Связаны. SQL> создавать пользовательский поток, идентифицируемый пользователями по умолчанию в таблице потоков; Создано пользователем. SQL> грант Connect, ресурс к потоку; Гранту это удалось. 3. Предоставить пользователям права на уровне столбцов: SQL> конн аутентификационно/аутентификация Связаны. SQL> обновление гранта (id) при тестировании в поток; Гранту это удалось. SQL> grant insert (table_name) при тестировании в поток; Гранту это удалось. SQL> SQL> выбор грантов при тестировании для потокового потока; Гранту это удалось. 4. Запрос информации о разрешении на уровне столбцов: SQL> выберите GRANTEE, OWNER,TABLE_NAME,COLUMN_NAME,GRANTOR,PRIVILEGE, GRANTABLE от user_col_privs; ВЛАДЕЛЕЦ ГРАНТОПОЛУЧАТЕЛЯ TABLE_NAME COLUMN_NAME GRANTOR PRIVILEGE GRA ------- ----- ---------- ----------- ------- --------- --- СТРИМИТЬ АУТЕНТИФИКАЦИОННЫЙ ТЕСТ TABLE_NAME АВТОРИЗАЦИЯ ВСТАВИТЬ НЕТ AUT AUTH TEST ID AUTH INSERT NO AUT AUTH TEST ID AUTH UPDATE NO СТРИМ: АУТЕНТИФИКАЦИОННЫЙ ТЕСТ ID АВТЕНТИФИКАЦИОННОГО ОБНОВЛЕНИЯ НЕТ 5. Пользователь теста входа проверяет разрешение SELECT: SQL> конн поток/поток Связаны. SQL> select * from(select * from auth.test order by 1), где rownum< =10; ID TABLE_NAME ВЛАДЕЛЕЦ TABLESPACE ---------- -------------------- ---------- ---------- 1 СИСТЕМНАЯ СИСТЕМА ICOL$ 2 IND$ SYS СИСТЕМЫ 3 СИСТЕМНАЯ СИСТЕМА COL$ 4 СИСТЕМНАЯ СИСТЕМА CLU$ 5 TAB$ СИСТЕМНАЯ СИСТЕМА 6 LOB$ СИСТЕМНАЯ СИСТЕМА 7 СИСТЕМНАЯ СИСТЕМА COLTYPE$ 8 СИСТЕМНАЯ СИСТЕМА SUBCOLTYPE$ 9 NTAB$ СИСТЕМНАЯ СИСТЕМА 10 СИСТЕМНАЯ СИСТЕМА REFCON$ Выбрано 10 рядов. 6. Проверьте контроль разрешения UPDATE на уровне столбца: SQL> обновить auth.test set owner='STREAM', где id =1; обновить auth.test set owner='STREAM', где id =1 * ОШИБКА в строке 1: ORA-01031: insufficient privileges Видно, что значение поля OWNER тестовой таблицы не разрешается изменять, сообщать ORA-01031: Недостаточное разрешение, поскольку вышеуказанное даёт пользователю тестового пользователя разрешение изменять поле ID тестовой таблицы, возможно изменить поле ID. SQL> обновить auth.test set id=10, где id=1; Обновлен один ряд. SQL> откат; Откат завершен. 7. Проверьте контроль разрешения INSERT на уровне столбцов: SQL> вставить в значения auth.test(1,'stream','stream','users'); вставить в значения auth.test(1,'stream','stream','users') * ОШИБКА в строке 1: ORA-01031: insufficient privileges Поскольку вышеуказанное даёт пользователю теста право на вставку на изменение TABLE_NAME поля тестовой таблицы, вставить TABLE_NAME поле возможно, но только если другие поля не имеют НЕКАКИХ ограничений. SQL> вставить в значения auth.test(table_name) («поток»); Создана 1 строка. SQL> откат; Откат завершен.
|