Синоним на пакет oracle

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

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

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

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

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

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


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

SQL> SHOW USER
USER is "SYSTEM"
SQL> DESC employees
ERROR:
ORA-04043: object employees does not exist
ORA-04043: объект employees не существует
SQL> DESC hr.employees
Name               Null?      Type
---------------    --------   --------------
EMPLOYEE_ID        NOT NULL   NUMBER(6)
FIRST_NAME                    VARCHAR2(20)
LAST_NAME          NOT NULL   VARCHAR2(25)
EMAIL              NOT NULL   VARCHAR2(25)
PHONE_NUMBER                  VARCHAR2(20)
HIRE_DATE          NOT NULL   DATE
JOB_ID             NOT NULL   VARCHAR2(10)
SALARY                        NUMBER(8,2)
COMMISSION_PCT                NUMBER(2,2)
MANAGER_ID                    NUMBER(6)
DEPARTMENT_ID                 NUMBER(4)
SQL>

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

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

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

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

SQL> CREATE PUBLIC SYNONYM employees FOR hr.employees;
Synonym created.
SQL>

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

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

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

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

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

SQL> CREATE SYNONYM addresses FOR hr.locations;
Synonym created.
SQL> SELECT * FROM addresses;

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

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

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

SQL> DROP SYNONYM addresses;
Synonym dropped.
SQL>

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

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

SQL> SELECT TABLE_NAME, SYNONYM_NAME
FROM dba_synonyms
WHERE OWNER = 'SALAPATI';
TABLE_NAME  SYNONYM_NAME
----------  ------------
DEPT        DEPT
EMP         EMP
SQL>

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

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

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

SQL> CONNECT samalapati/sammyy1
SQL> ALTER SESSION SET CURRENT_SCHEMA = scott;
SQL> SELECT * FROM emp;

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

Вас заинтересует / Intresting for you:

В этом учебном материале вы узнаете, как создавать и удалять синонимы (create and drop synonyms) в Oracle/PLSQL с синтаксисом и примерами.

Описание

В Oracle/PLSQL Synonym это альтернативное имя для таких объектов, как таблицы, представления, последовательности, хранимые процедуры и другие объекты базы данных.
Как правило, вы используете синонимы, когда предоставляете доступ к объекту из другой схемы, и вы не хотите, чтобы пользователи беспокоились о том, к какой схеме относится объект.

Create (or Replace) Synonym

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

Синтаксис

Синтаксис для создания синонимов Oracle/PLSQL:

CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema .] synonym_name
FOR [schema .] object_name [@ dblink];

OR REPLACE
Позволяет пересоздать синоним (если он уже существует), без необходимости выдавать команду DROP synonym.
PUBLIC
Это означает, что синоним является публичным и доступен для всех пользователей. Помните, что пользователь сначала должен иметь соответствующие привилегии для объекта использования синонима.
schema
Соответствующая схема. Если эта фраза опущена, Oracle предполагает, что вы имеете в виду вашу собственную схему.
object_name
Имя объекта, для которого вы создаете синоним. Это может быть один из следующих объектов:

  • table
  • view
  • sequence
  • stored procedure
  • function
  • package
  • materialized view
  • java class schema object
  • user-defined object
  • synonym

Пример

Рассмотрим пример того, как создать синоним в Oracle/PLSQL.

Например:

CREATE PUBLIC SYNONYM suppliers

FOR app.suppliers;

Этот первый пример CREATE SYNONYM демонстрирует, как создать синоним с названием suppliers. Теперь, пользователи других схем могут ссылаться на таблицу с suppliers без префикса с именем схемы и именем таблицы.

Например:

Если это синоним уже существует, и вы хотите его пересоздать, то можете использовать OR REPLACE следующим образом:

CREATE OR REPLACE PUBLIC SYNONYM suppliers

FOR app.suppliers;

Drop synonym

После того, как синоним был создан в Oracle, вам в какой-то момент понадобится его удалить.

Синтаксис

Синтаксис drop synonym в Oracle/PLSQL:

DROP [PUBLIC] SYNONYM [schema .] synonym_name [force];

PUBLIC
Позволяет удалить public synonym. Если вы указали PUBLIC, то можете не указывать схему.
force
Это принудит Oracle удалить synonym, даже если он имеет зависимости. Это, вероятно, не очень хорошая идея, чтобы использовать force, поскольку это может привести к недействительности объектов Oracle.

Пример

Рассмотрим пример того, как удалить synonym в Oracle/PLSQL.

Например:

DROP PUBLIC SYNONYM suppliers;

Оператор DROP удалит синоним с названием suppliers, который мы определяли ранее.

I created a synonym for a package, but I can’t do anything with it, including a simple desc command. Check out the codes:

Create package sql (executed on owner user)

create or replace PACKAGE pkg_elmah$log_error
IS
    PROCEDURE LogError
    (
        v_ErrorId IN elmah$error.errorid%TYPE,
        v_Application IN elmah$error.application%TYPE,
        v_Host IN elmah$error.host%TYPE,
        v_Type IN elmah$error.type%TYPE,
        v_Source IN elmah$error.source%TYPE,
        v_Message IN elmah$error.message%TYPE,
        v_User IN elmah$error.username%TYPE,
        v_AllXml IN elmah$error.allxml%TYPE,
        v_StatusCode IN elmah$error.statuscode%TYPE,
        v_TimeUtc IN elmah$error.timeutc%TYPE
    );

END pkg_elmah$log_error;

Create synonym and test sql (executed on not owner user)

CREATE SYNONYM pkg_elmah$log_error FOR DRSP.pkg_elmah$log_error; 
desc pkg_elmah$log_error; 
---------RESULT: object does not exist
execute pkg_elmah$log_error.logerror;
---------RESULT: identifier pkg_elmah$log_error must be declared

These codes run fine when I log in with the owner of these objects.

Grant was given as follows (I seem unable to give to the procedure only, as it gives an ORA-04042, so I gave it to the package):

grant execute on PKG_ELMAH$LOG_ERROR to not_owner

Environment: WINDOWS 7 64bits; SQL DEVELOPER 4.0.3.16; ORACLE CLIENT 11.2

Details of the synonym:
Details of the synonym.

Details of the package:
package details

Summary: in this tutorial, you will learn how to use the Oracle CREATE SYNONYM statement to create an alternative name for a database object such as a table, view, sequence, procedure, stored function, and materialized view.

Introduction to Oracle CREATE SYNONYM statement

The CREATE SYNONYM statement allows you to create a synonym which is an alternative name for a database object such as a table, view, sequence, procedure, stored function, and materialized view.

Here is the basic syntax of creating a new synonym:

CREATE [OR REPLACE] [PUBLIC] SYNONYM schema.synonym_name FOR schema.object;

Code language: SQL (Structured Query Language) (sql)

In this syntax:

  • First, specify the name of the synonym and its schema. If you skip the schema, Oracle will create the synonym in your own schema.
  • Second, specify the object for which you want to create the synonym after the FOR keyword. Note that the schema object (schema.object) cannot be contained in a package.
  • Third, use the OR REPLACE option if you want to re-create the synonym if it already exists. In case the synonym does not exist, the OR REPLACE has no effect.
  • Fourth, use the PUBLIC keyword to create a public synonym which is a synonym that will be accessible to all users. Note that users must have sufficient privileges on the underlying objects to use the public synonyms.

Once you define a synonym for an object, you can reference it in the SQL statements such as the SELECT, INSERT, UPDATE, and DELETE statement.

Note that you can create a synonym for a table or a view that doesn’t exist. However, the target table or view must be available at the time you use the synonym. In addition, synonyms share the same namespace as tables or views, therefore, you cannot create a synonym which has the same name as a table or a view that already exists in the same schema.

This example uses the CREATE SYNONYM statement to create a synonym for the inventories table from the sample database:

CREATE SYNONYM stocks FOR inventories;

Code language: SQL (Structured Query Language) (sql)

If you use SQL Developer, you can view the newly created synonym in under the Synonym nodes as shown in the following picture:

oracle create synonym example

Now, you can use the stocks synonym instead of the inventories table in the query like the following:

SELECT * FROM stocks;

Code language: SQL (Structured Query Language) (sql)

Advantages of Oracle synonyms

First, synonyms allow you to change complicated and lengthy names by simplified aliases. It is very helpful if you work with the legacy systems. So instead of referring a table like human_resources.employee_locations, you can use offices.

Second, synonyms can help backward compatibility for the legacy applications. For example, you rename a table but do not want to affect the current applications that currently use the table. To keep the applications working properly, you can create a synonym that has the name the same as the old name of the table.

Third, synonyms help moving objects between schemas, even databases, without breaking the existing code.

In this tutorial, you have learned how to use the Oracle CREATE SYNONYM statement to create an alternative name for a database object.

Was this tutorial helpful?

In this article, I’ll explain all you need to know about Synonyms.

What is an Oracle Synonym?

A synonym is an object in a database that represents an alternative name for other objects, such as tables, views, sequences, and stored procedures.

Why Would you Use a Synonym?

Why would you want to create a synonym? Why not just rename the original object?

The main reason is to simplify the user access to an object. You can provide access to an object to a user using a synonym, and you don’t need to worry about who owns the original object.

It also simplifies access to objects, especially when multiple databases and schemas are involved.

The examples later in this article will demonstrate this further.

Oracle Synonym vs View

As mentioned above, a synonym is an alias or alternative name for an object.

How is this different from a view?

A view object is an SQL query that is saved and run when other queries use that view. It works like a table.

Why would you use a synonym instead of a view?

Well, a view contains more complicated logic. If you just want to provide an alias for a table or another object, you can use a synonym. If you want to SELECT data from a table and use WHERE conditions or other logic, then a view is better.

Also, a view can only be created on objects with data, such as tables and other views. Synonyms can be created on tables, views, sequences, stored procedures, and more.

They both have their advantages, but they should only be used when appropriate.

Difference Between Public and Private Synonym in Oracle

There are two types of synonyms that can be created on an Oracle database: public and private.

  • Public synonym: can be accessed by any user on the database. The user who creates the synonym it does not own it – it’s owned by the PUBLIC user group.
  • Private synonym: can only be accessed by the person who created the synonym. This user is also the owner. The synonym name must be unique within the schema.

What happens if you have a public synonym with the same name as an existing object? Or a private synonym?

This is a valid scenario, and Oracle has rules on which order they are processed in. Just like how, in mathematics, the multiplication and division are performed before the addition and subtraction, Oracle has an order in the way that the objects are looked up.

The order of precedence for objects and synonyms is:

  1. Local schema object. Oracle will look at the user’s schema for the object name.
  2. Private synonym. If a schema object is not found, Oracle will look in the private synonyms for the user.
  3. Public synonym. If a private synonym is not found, Oracle will look in the public synonyms.

This is how public synonyms and private synonyms compare:

Criteria Public Private
Who owns it? PUBLIC user group The user that created it
Scope of the unique name All database objects The schema of the user who created it
Who can use it? All database users Only the user who created it
Order of precedence Third, after schema objects and private synonyms Second, after schema objects

Generally, it’s a good idea to avoid creating public synonyms. Sure, they can make management a bit easier, but they can pose a security risk and can make development harder, because there’s an object that exists and available to all users.

How to Create a Synonym in Oracle

To create a synonym in Oracle (either private or public), we use the CREATE SYNONYM command.

The syntax is:

CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.] synonym_name
FOR [schema.] object_name [@dblink_name];

The parameters for this function are:

  • OR REPLACE: This is optional and allows you to replace an existing synonym name, instead of dropping it and recreating it.
  • PUBLIC: Use the PUBLIC keyword to create a public synonym. If this is omitted, a private synonym is created.
  • schema: This is optional and is the name of the schema you want to create the synonym in. If this is omitted, the synonym is created in your own schema. If you are creating a PUBLIC synonym, you cannot specify a schema.
  • synonym_name: The name of the new synonym that is being created. It should be 30 characters or less. I say should, because names longer than 30 characters can be created and dropped, but they are transformed into a shorter string for storage.
  • FOR schema: The schema is optional, but specifies the schema name that the object exists in.
  • object_name: The name of the object that the synonym will relate to.
  • dblink_name: This is the name of the database link if it is required.

A synonym can be created on the following types of objects:

  • table
  • view
  • stored procedure
  • function
  • package
  • sequence
  • materialised view
  • synonym
  • java class schema object
  • user-defined object

Let’s see some examples of creating a synonym.

Example 1 – Create private synonym

CREATE SYNONYM emp
FOR hr.employees;

This creates a new private synonym called emp, which refers to the employees object in the hr schema.

Example 2 – Create public synonym

CREATE PUBLIC SYNONYM cust
FOR sales.customers;

This will create a new public synonym for the customer object in the sales schema. All users can query the cust synonym and access the sales.customers table (if they have access to the underlying sales.customers table).

Example 3 – Same name

CREATE SYNONYM product
FOR sales.product;

This will create a private synonym. Notice that both objects have the same name. A query such as this will look for the local object first (which does not exist), and then the synonym:

SELECT * FROM product;

However, querying on the original object will also access that object:

SELECT * FROM sales.product;

If a new table was created in the user’s current schema called product, then this query will look at that table instead of the synonym:

SELECT * FROM product;

How to Drop a Synonym in Oracle

To remove a synonym that already exists, you can drop it from the database.

The syntax for doing this is:

DROP [PUBLIC] SYNONYM [schema.] synonym_name [FORCE];

The parameters are:

  • PUBLIC: specifies whether you are dropping a private or public synonym. If you’re not sure what type your synonym is, then see the section below on finding all synonyms in a database.
  • schema: This is the name of the schema that your synonym exists on. This is only needed if you are dropping a private schema.
  • synonym_name: The name of the synonym to be dropped.
  • FORCE: This will force Oracle to drop the synonym even if it has dependencies.

Let’s see some examples.

Example 1 – Drop a public synonym

DROP PUBLIC SYNONYM emp;

This will drop the public synonym emp.

Example 2 – Drop a private synonym

DROP SYNONYM customer;

This will drop the private synonym called customer.

Example 3 – Drop a synonym with a schema

DROP SYNONYM hr.emp;

This will drop the synonym emp that exists in the hr schema.

How to Find All Synonyms In the Database

So you’ve created some synonyms, or your database already has some. How can you check the synonyms in Oracle? How do you know if a synonym is public or private?

There is no “oracle list synonyms” command, but you can query some database views to find this information:

  • all_synonyms: View synonyms available to the current user.
  • dba_synonyms: View all synonyms in the database.
  • user_synonyms: Private synonyms owned by the current user.

To find a list of synonyms on the database, you can run these queries.

SELECT * FROM all_synonyms;

This shows us a list of all synonyms available to the current user.

A query on the dba_synonyms view will show us all synonyms in the database:

SELECT * FROM dba_synonyms;

And finally, a query on user_synonyms will show us all private synonyms owned by the current user:

SELECT * FROM user_synonyms;

Conclusion

So, in summary, a synonym is a database object that allows you to create an alias to another object. They are helpful for simplifying your queries and improving the way access to data and objects is handled.

Lastly, if you enjoy the information and career advice I’ve been providing, sign up to my newsletter below to stay up-to-date on my articles. You’ll also receive a fantastic bonus. Thanks!

Понравилась статья? Поделить с друзьями:
  • Синоним мясной деликатес
  • Синоним мясная промышленность
  • Синоним мясная продукция
  • Синоним мясная лавка
  • Синоним мягкой одонтомы