Как заставить GRANT сохраняться для таблицы, которую удаляют и воссоздают? - PullRequest
4 голосов
/ 25 мая 2010

Я нахожусь на довольно новом проекте, где мы все еще модифицируем дизайн наших таблиц базы данных Oracle 11g.Таким образом, мы отбрасываем и воссоздаем наши таблицы довольно часто, чтобы убедиться, что наши сценарии создания таблиц работают, как и ожидалось, всякий раз, когда мы вносим изменения.

Наша база данных состоит из 2 схем.Одна схема имеет несколько таблиц с триггерами INSERT, которые иногда копируют данные в таблицы в нашей второй схеме.Это требует от нас входа в базу данных с учетной записью администратора, такой как sysdba и GRANT доступ к первой схеме к необходимым таблицам второй схемы, например

GRANT ALL ON schema_two.SomeTable TO schema_one;

Наша проблема заключается в том, что каждыйКогда мы вносим изменения в дизайн нашей базы данных и хотим удалить и воссоздать наши таблицы базы данных, доступ, который мы GRANT -ed к schema_one прекратили, когда таблица была удалена.Таким образом, это создает еще один раздражающий шаг, когда мы должны войти в систему с учетной записью администратора, чтобы повторно GRANT получать доступ каждый раз, когда одна из этих таблиц удаляется и воссоздается.

Это не так уж сложно, но я бы хотел исключить как можно больше шагов из наших процедур разработки и тестирования.Есть ли какой-нибудь способ GRANT доступа к таблице таким образом, чтобы права доступа GRANT пережили удаление таблицы и ее повторное создание?И если это невозможно, то есть ли лучший способ сделать это?

Ответы [ 5 ]

7 голосов
/ 25 мая 2010

Так что причина отмены грантов в том, что новая таблица - это другой объект.

SQL> select object_id from user_objects
  2  where object_name = 'T72'
  3  /

 OBJECT_ID
----------
    659195

SQL> drop table t72
  2  /

Table dropped.

SQL> create table t72 (id number)
  2  /

Table created.

SQL> select object_id from user_objects
  2  where object_name = 'T72'
  3  /

 OBJECT_ID
----------
    659212

SQL>

Гранты находятся на объекте, а не на имени объекта.

Что я не понимаю в вашей проблеме, так это то, что у вас есть процесс, который удаляет и заново создает таблицы в schema_two. Почему этот процесс также не предоставляет привилегии на эти таблицы для schema_one? Почему у вас есть учетная запись администратора, чтобы сделать это вместо этого? Я предполагаю, что вы подключаетесь как schema_two для выполнения операторов DROP и CREATE. Почему бы просто не добавить операторы GRANT к этому шагу?

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

5 голосов
/ 25 мая 2010

Вы можете предоставить select any table, insert any table и т. Д. Schema_one, но это кажется излишним и не отражает того, что вы делаете в производстве (надеюсь). Почему вы не можете выдать грант одновременно с созданием таблицы, когда вы вошли в систему как schema_two? Я всегда делал это в сценариях создания, и только когда-либо приходилось использовать учетную запись администратора для предоставления сторонних или системных привилегий. Я подозреваю, что что-то упустил ...

3 голосов
/ 25 мая 2010

Что вы делаете, что не может быть обработано инструкциями ALTER TABLE?

Следующим лучшим вариантом может быть создание представления, которое ссылается на таблицу, которая иногда исчезает - представление не исчезнет, ​​вы просто получите ошибку, если таблица не существует в такой ситуации. IE:

CREATE VIEW table_vw AS
  SELECT t.* 
    FROM DISAPPEARING_TABLE t

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

1 голос
/ 25 мая 2010

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

Делись и наслаждайся.

1 голос
/ 25 мая 2010

У вас может быть триггер DDL или пакетное задание, которое запускается каждые несколько минут и автоматически предоставляет привилегии. Но это немного дыра в безопасности и не будет представлять производство.

...