Как посмотреть синонимы oracle

Обновлено: 06.07.2024

Выполняется с помощью ключевых слов ADD и DROP или же MODIFY (с отчасти различной областью применимости).

Пример употребления слова MODIFY для добавления и для снятия ограничения NOT NULL :

Пример употребления слов ADD и DROP с целью добавления и снятия ограничения первичного ключа :

Другие примеры и пояснения последуют далее в самостоятельном разделе.

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

Препятствием к добавлению ограничения целостности может служить вступление в противоречие с имеющимися в таблице данными. Например, если в столбце обнаруживается отсутствие значения (хотя бы в поле одной строки), добавить к определению столбца правило NOT NULL не удастся; наличие повторяющихся значений в столбцах не позволит завести правило уникальности или первичного ключа, и так далее.

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

Удаление столбца

Возможно с версии Oracle 8.

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

Логическим препятствием для удаления столбца может оказаться его участие в определении внешнего ключа в качестве адресата. Не будь этого, по удалению столбца в БД осталось бы некорректно определенное правило внешнего ключа. Вместо последовательного упразднения мешающего ограничения и удаления столбца программист может обойтись одной командой, что быстрее и короче:

Значения в столбцах бывшего внешнего ключа остаются, но уже не обремененные ссылочной целостностью.

Средства повышения эффективности удаления столбца

Следующие замечания не касаются удаления виртуальных столбцов (с версии 11), но только реальных. Удаление реального столбца влечет физическое переформатирование всех строк таблицы, что может составить технологическую проблему в случае больших объемов данных. Для нее предлагается два решения.

Следующее указание позволит ускорить удаление столбца за счет выполнения контрольной точки автоматически после правки каждых 1000 строк (и тогда сегмент отмены не будет расти чрезмерно):

ALTER TABLE projx DROP ( pcode ) CHECKPOINT 1000;

Если в процессе удаления произошел сбой, процедуру можно продолжить командой

Другой способ — объявить сначала столбец "неиспользуемым", что не приведет к физическому перебору имеющихся записей:

Для программы таблица мгновенно окажется без столбца, хотя в базе данные столбца никуда не денутся. СУБД сама их будет изымать из полей по мере обращения к строкам по текущим поводам, то есть заодно. В конечном итоге фактическое переформатирование строк таблицы может растянуться на очень долгое время. Однако при желании его можно будет целенаправленно завершить. Для этого нужно дождаться невысокой загруженности СУБД обычной работой и выдать по образцу следующего:

Переименования

Неудачно или несовременно названную таблицу можно переименовать, например:

Команда RENAME по сравнению с более сфокусированной ALTER TABLE … RENAME является более общей, так как позволяет переименовать помимо таблиц объекты некоторых других типов: представление данных (view), генератор последовательности (sequence) и частный синоним. Ее название унаследовано языком SQL от реляционной модели, где имеется одноименная операция.

Пример переименования столбца:

При переименовании объекта СУБД пометит свойства зависимых от данного объектов (например, хранимых процедур на PL/SQL, обращающихся к данной таблице) признаком INVALID , что вызовет потребность их перекомпиляции перед очередным обращением к ним. Ссылки же на таблицу из внешних программ находятся вне компетенции БД; изменение имен пройдет для таких программ незаметно, но в то же время они потеряют свою работоспособность. Это обстоятельство существенно уменьшает ценность операции переименования в реальной практике.

Переименовать таблицу можно и непосредственной правкой таблицы OBJ$ словаря-справочника (см. далее). Такой же подход позволяет переименовать и столбцы таблиц путем внесения правки в таблицу COL$ . Однако применять его следует только опытным пользователям и с осторожностью. Он осуществим только для пользователей, имеющих доступ к этим таблицам схемы SYS , и к тому же не изменит состояния зависимых от таблицы подпрограмм на значение INVALID .

Использование синонимов для именования таблиц

Синонимы позволяют завести дополнительные имена для обращения к таблице, не обесценивая основного имени:

Теперь, обнаружив обращение к MEMBERS , СУБД определит по своей справочной информации, что это синоним имени EMP , и обратится фактически к EMP . Возможность прямого обращения по имени EMP в тексте команды SQL при этом не теряется, и на работе старых программ появление у таблицы синонимов никак не скажется. Это, однако, не касается команд DDL ALTER/DROP TABLE , где ссылаться следует только на истинное имя таблицы (в полном соответствии с синтаксисом, так как в этих командах используется именно ключевое слово TABLE ).

На практике синонимы заводятся с разными целями:

  • присвоить таблице имя, больше подходящее ее содержанию;
  • упростить имя таблицы в запросе, например, OBJECTS вместо SYS.OBJ$ ;
  • замаскировать обращение к таблице в другой БД или в другой схеме для придания гибкости кода.

Удаление выполняется командой DROP SYNONYM :

Синоним, заведенный в схеме (например, SCOTT ), как и таблица, сам становится объектом схемы, доступным изначально только пользователю — хозяину схемы или же администратору с соответствующим полномочием. Однако Oracle позволяет создавать еще и PUBLIC SYNONYM : "внесхемный", общедоступный синоним. Публичные синонимы активно используются в административной части БД Oracle, но нередко и обычными разработчиками в своих целях. В силу того, что пространства имен публичных и схемных синонимов разные, возможны "спорные" ситуации:

По существующему правилу разрешения имен Oracle отдаст в последнем запросе предпочтение схемному ("частному") синониму. Получается, что появление частного синонима в некоторых случаях способно изменять смысл существовавшего в программе до этого запроса, о чем не следует забывать разработчику.

Создание синонимов в Oracle требует привилегий (полномочий) CREATE SYNONYM и CREATE PUBLIC SYNONYM , изначально отсутствующих у пользователя SCOTT . В жизни, чтобы обеспечить пользователя синонимами, не обязательно выдавать ему эти привилегии. Создать пользователю Oracle синоним способен, например, администратор.

Использование синонимов для таблиц — это частный случай. В общем синонимы можно создавать и для некоторых прочих хранимых в БД объектов, например, для процедур или функций.

Справочная информация о таблицах и прочих объектах в БД

Место хранения справочной информации об объектах, составляющих БД ("хранимых в БД"), называется в базах данных словарем-справочником ( data dictionary ). Русский термин-перевод пришел в эту область ИТ из более старой лексики, где обозначает "справочную книгу, которая содержит собрание слов (словосочетаний, идиом и т. д.), расположенных по определенному принципу, и дает сведения об их значениях, употреблении, происхождении; информацию о понятиях и предметах, ими обозначаемых и др.". В БД этот термин, не утратив самой общей сути, стал значительно более конкретен. Иногда вместо него пользуются термином системный каталог.

В Oracle словарь-справочник реализован набором таблиц в составе самой БД, составляющих "справочную часть" БД. Количество таких таблиц в любой БД Oracle — несколько сотен. Официальный их перечень приведен в документации по Oracle. Вот два примера таблиц словаря-справочника:

  • USER_TABLES — перечень всех таблиц схемы пользователя и их одиночных (не множественных) свойств;
  • USER_TAB_COLUMNS — перечень столбцов всех таблиц схемы пользователя и одиночных свойств столбцов.

Следующие два запроса к таблицам словаря-справочника предоставляют основные сведения о всех имеющихся в схеме пользователя таблицах и основные сведения о столбцах таблицы PROJ . Три команды COLUMN предназначены для SQL*Plus и задают приемлемый формат выдачи на экран:

Возможности словаря-справочника дополняются способностью Oracle хранить в нем "комментарии", краткие пояснения к сведениям о таблицах и столбцах. Для заведения комментария в Oracle SQL имеется особая команда COMMENT :

Наблюдать имеющиеся комментарии можно через таблицы словаря-справочника USER_COL_COMMENTS и USER_TAB_COMMENTS :

Синонимы (synonyms) Oracle Database — это псевдонимы объектов базы данных, которые служат в основном для облегчения пользователям доступа к объектам, принадлежащим другим пользователям, а также в целях безопасности. Синонимы скрывают идентичность лежащих в их основе объектов и могут быть как приватными (private), так и общедоступными (public). Общедоступные синонимы доступны всем пользователям базы данных,а приватные синонимы являются составной частью схемы отдельного пользователя, и другим пользователям базы следует выдавать права доступа для использования приватных синонимов. Синонимы Oracle могут быть созданы для таблиц, представлений, материализованных представлений и хранимого кода — пакетов и процедур.

Синонимы Oracle — очень мощное средство с точки зрения обеспечения пользователям доступа к объектам, которые не принадлежат к их схемам. Все синонимы должны создаваться явно командой CREATE SYNONYM, а лежащие в основе объекты могут находиться в той же базе данных или в других базах, подключенных по связям баз данных.

Сфера применения синонимов Oracle

Есть два основных применения синонимов.

  • Для обеспечения прозрачности объектов. Синонимы могут быть созданы для обеспечения прозрачности исходных объектов для пользователя.
  • Для прозрачности расположения. Синонимы могут быть созданы как псевдонимы таблиц и прочих объектов, относящихся к нелокальной базе данных.

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

Когда вы создаете таблицу или процедуру, база данных создает их в вашей схеме, а другие пользователи могут обращаться к ним, используя имя вашей схемы в качестве префикса имени объекта. В листинге ниже показано несколько примеров, иллюстрирующих это положение.

Как видите, когда пользователь SYSTEM пытается получить структуру таблицы без префикса — имени схемы, Oracle выдает ошибку, сообщающую об отсутствии таблицы. Чтобы обойти это, владелец схемы должен создать синоним с тем же именем, что и у таблицы. Как только пользователь SYSTEM применит нотацию схема.таблица, он сможет увидеть содержимое таблицы.

Создание общедоступного синонима

Общедоступные (public) синонимы относятся к специальной схеме базы данных Oracle, именуемой PUBLIC. Как упоминалось ранее, общедоступные синонимы видны всем пользователям базы данных. Общедоступные синонимы обычно создаются владельцем приложения для таблиц и прочих объектов, таких как процедуры и пакеты,чтобы пользователи приложения могли видеть эти объекты.

В следующем коде показано, как создается общедоступный синоним для таблицы employees:

Теперь любой пользователь сможет видеть таблицу, просто набрав ее исходное имя. При желании с помощью оператора CREATE SYNONYM таблице можно дать другое имя. Помните, что администратор базы данных должен явно выдать привилегию CREATE PUBLIC SYNONYM пользователю hr, чтобы тот мог создавать общедоступные синонимы.

Возможность видеть таблицу через общедоступный (или приватный) синоним, еще не означает возможность выполнения над ней операций SELECT, INSERT, UPDATE или DELETE. Для выполнения таких операций пользователю нужны специальные привилегии для доступа к исходному объекту, выданные владельцем приложения непосредственно или через роли.

Создание приватного синонима

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

В следующем примере показано, как создать приватный синоним по имени addresses для таблицы locations. Обратите внимание, что после создания к приватному синониму можно обращаться как к первоначальному имени таблицы.

Уничтожение синонима

И приватный, и общедоступный синонимы уничтожаются командой DROP SYNONYM,но есть одно отличие. При уничтожении общедоступного синонима после ключевого слова DROP должно находиться ключевое слово PUBLIC.

Ниже показан пример уничтожения приватного синонима:

Управление синонимами

Представление DBA_SYNONYMS содержит информацию обо всех синонимах в вашей базе данных. Синонимы основаны на лежащих в основе базовых таблицах, и узнать имена базовых объектов можно, запустив запрос, подобный следующему:

Используйте представление DBA_SYNONYMS для выяснения имен базовых таблиц,скрывающихся за синонимами.

Переключение к другой схеме

Если вы постоянно используете таблицы, принадлежащие другой схеме, и в этой схеме нет никаких синонимов, придется перед каждым именем таблицы указывать квалификатор схемы. Например, для обращения к таблице emp, принадлежащей пользователю scott, понадобится указывать emp.scott. Чтобы избежать этого, можно применить следующий оператор ALTER SESSION SET SCHEMA:

Использование оператора ALTER SESSION не приводит к автоматической выдаче каких-либо привилегий. Для того чтобы запросить таблицу emp без квалификатора схемы, как показано в предыдущем примере, пользователь должен иметь привилегию SELECT на таблице emp.

Синоним – это альтернативное имя объекта. Если создан синоним для объекта, то все SQL команды к объекту могут выполняться используя настоящее имя или синоним. Это может показаться очень простым, но это не так. Использование синонимов позволяет приложениям работать для любого пользователя, вне зависимости от схемы в которой лежат таблицы и представления и даже БД. Рассмотрим запрос

select * from hr.employees@prod;

Пользователь выполняющий такой запрос должен знать что таблица employees принадлежит схеме HR в БД определяемой сслыкой PROD. Если общий синоним был созда таким запросом

create public synonym emp for hr.employees@prod;

то все пользователи (все!) могут использовать запрос вида

select * from emp;

Так же как и команды SELECT, DML команды могут обращаться к синонимам так же как к объектам на которые они ссылаются.

Приватные синонимы (private synonyms) – это объекты схемы. Они могут быть или в текущей схеме, или использоваться вместе с именем схемы. Общие (public) синонимы существуют независимо от схемы. Общие синонимы могут использоваться любым пользователем кому назначены соответсвующие права без использования имени схемы. Приватные синонимы должны иметь уникальное имя в схеме. Общие синонимы могут иметь такое же имя как и иям объекта схемы. Когда выполняется запрос без указания схемы, Oracle вначале проверяет есть ли объект с таким именем в текущей схеме, и только если он не найдет Oracle попробует найти общий синоним с таким именем. То есть если в предыдущем примере у пользователя есть таблица EMP – это будет то что отобразится пользователю – не таблица назначенная общему синониму.

Синтаксис создания синонима

CREATE [PUBLIC] SYNONYM synonym FOR object ;

Пользователю должны быть назначены права для создания синонимов (приватных) и дополнительные права для создания общих синонимов. Обычно только администратор БД может создавать и удалять общие синонимы. Это правильно потому что их создание (или удаление) влияет на всех пользователей.

EXAM TIP The “public” in “public synonym” means that it is not a schema object and cannot therefore be prefixed with a schema name. It does not mean that everyone has permissions against it.

Для удаления синонима используется команда

DROP [PUBLIC] SYNONYM synonym ;

Если объект на который ссылается синоним (таблица или представление) удалён, синоним не удаляется. Любое обращение к синониму вернёт ошибку. В этом отношении синоинмы работают как представления. Если объекты были вновь созданы, синонимы должны быть перекомпилированы перед использованием. Как и для представлений, это случится автоматически при обращении к синониму или вручную использовав команду

Объекты базы данных принадлежат тем пользователям, которые их создали, и доступны лишь в схеме конкретного пользователя, если только пользователь явным образом не предоставил право на доступ к объектам другим пользователям или ролям, назначенным другим пользователям. Но даже предоставив полномочия на использование объекта, пользователь должен отдавать себе отчет в том, что владение схемой ограничивает доступ к объектам данных Oracle. Допустим, что таблица STUDENT существует в схеме пользователя STUD, а пользователь USER1 пытается обратиться к этой таблице:

SELECT * FROM student WHERE kod_stud = 256;

SELECT * FROM student

*

ORA-00942: table or view does not exist

(таблица или представление не существует)

Oracle не возвращает данные, связанные с KOD_STUD= 256, а сообщает пользователю о том, что объект не существует. Причина, по которой USER1 не может видеть таб­лицу в схеме STUD, заключается в том, что пользователь USER1 не обратился к таблице как к находящейся в схеме STUD. Покажем, как оператор select может быть успешно выполнен:

SELECT * FROM stud.student WHERE kod_stud = 256;

Синоним — это альтерна­тивный способ обращения к существующей таблице со стороны пользователей. Синонимы позволяют обращаться к объекту базы данных или по другому имени, или без обязательной ссылки на владельца объекта. Однако синоним не изменяет харак­теристики описания таблицы. Таким образом, с помощью синонимов пользователи могут обращаться к таблице, не предваряя ее имени именем владельца.

Синонимы могут быть общими или частными. К частному (private) синониму может обращаться только тот пользователь, который создал его и владеет им. Если же синоним общий (public), он доступен любому пользователю базы данных. Частный и общий синонимы создаются с помощью команд CREATE SYNONYM и CREATE PUBLIC SYNONYM. Причем на создание общих синонимов нужно иметь специальную привилегию.

Общий синоним создается привилегированным пользователем и позволяет другим пользователям базы данных обращаться к конкретной таблице, не предваряя ссылку на нее именем схемы.

Пример: Пользователь STUD может создать общий синоним для таблицы STUDENT.

CREATE PUBLIC SYNONYM student FOR stud.student;

После создания этого синонима пользователь USER1 может обратиться к таблице с его помощью:

SELECT * FROM student WHERE kod_stud = 256;

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

Пример: В следующем программном блоке пользователь USER1 получает тот же результат, что и раньше, но с помощью частного синонима.

CREATE SYNONYM student FOR stud.student;

SELECT * FROM student WHERE kod_stud = 256;

Для удаления синонимов используется команда DROP SYNONYM:

DROP SYNONYM student;

DROP PUBLIC SYNONYM student;

Объекты базы данных принадлежат тем пользователям, которые их создали, и доступны лишь в схеме конкретного пользователя, если только пользователь явным образом не предоставил право на доступ к объектам другим пользователям или ролям, назначенным другим пользователям. Но даже предоставив полномочия на использование объекта, пользователь должен отдавать себе отчет в том, что владение схемой ограничивает доступ к объектам данных Oracle. Допустим, что таблица STUDENT существует в схеме пользователя S TUD , а пользователь USER 1 пытается обратиться к этой таблице:

SELECT * FROM studentWHERE kod_stud = 256;

SELECT * FROM student

ORA-00942: table or view does not exist

(таблица или представление не существует)

Oracle не возвращает данные, связанные с KOD _ STUD = 256, а сообщает пользователю о том, что объект не существует. Причина, по которой USER 1 не может видеть таб­лицу в схеме STUD , заключается в том, что пользователь USER 1 не обратился к таблице как к находящейся в схеме STUD . Покажем, как оператор select может быть успешно выполнен:

SELECT * FROM stud.student WHERE kod_stud = 256;

Синонимы могут быть общими или частными. К частному (private) синониму может обращаться только тот пользователь, который создал его и владеет им. Если же синоним общий (public), он доступен любому пользователю базы данных. Частный и общий синонимы создаются с помощью команд CREATE SYNONYM и CREATE PUBLIC SYNONYM. Причем на создание общих синонимов нужно иметь специальную привилегию.

Общий синоним создается привилегированным пользователем и позволяет другим пользователям базы данных обращаться к конкретной таблице, не предваряя ссылку на нее именем схемы.

Пример : Пользователь STUD может создать общий синоним для таблицы STUDENT .

CREATE PUBLIC SYNONYM student FOR stud.student;

После создания этого синонима пользователь USER 1 может обратиться к таблице с его помощью:

SELECT * FROM student WHERE kod_stud = 256;

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

Пример : В следующем программном блоке пользователь USER 1 получает тот же результат, что и раньше, но с помощью частного синонима.

Читайте также: