Спрятать колонку

Oracle. Синонимы и DDL, DML

В Oracle есть такая замечательная возможность - создавать синонимы, а потом их использовать. Если не все их создают, то уж пользуются ими точно все: уж просто вычитывая данные из таблицы, к примеру, ALL_OBJECTS.

Ковыряясь в синонимах, обнаружил небольшую странность в их поведении. С ними нельзя проводить DDL операций, тогда как DML разрешены. Рассмотрим небольшой пример.

Создадим таблицу table_name и синоним для нее table_synonym

CREATE TABLE table_name(
    id number
);
 
CREATE synonym table_synonym FOR table_name;

Выполним к ней запрос:

SELECT * FROM table_synonym

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

ALTER TABLE table_synonym
ADD (name varchar2(20));

получаем ошибку: table or view does not exist, что правильно Такая же операция без использования синонима выполнится корректно:

ALTER TABLE table_name
ADD (name varchar2(20));

Работает это так потому, что синоним не есть таблица, а лишь объект, с помощью которого можно обратится к данным. И если есть право ALTER TABLE, то нет права ALTER_TABLE_through_synonym, что может быть и не совсем логично, потому что, имея права на изменения объекта, мы могли бы изменять этот объект через его синоним, но такова реализация.

добавлено:
и все же это странно. у нас ведь нет права на delete from synonym,а удалить мы можем данные без проблем. в то время как такая же операция с alter table synonym не проходит. странно, пока нормального объяснения не нашел.

RSS-материал

Наверх