Oracle PL/SQL Tutorial/User Privilege/Synonyms
Содержание
create a synonym for a view
<source lang="sql">
SQL> SQL> create table emp(
2 emp_id integer primary key 3 ,lastname varchar2(20) not null 4 ,firstname varchar2(15) not null 5 ,midinit varchar2(1) 6 ,street varchar2(30) 7 ,city varchar2(20) 8 ,state varchar2(2) 9 ,zip varchar2(5) 10 ,shortZipCode varchar2(4) 11 ,area_code varchar2(3) 12 ,phone varchar2(8) 13 ,company_name varchar2(50));
Table created. SQL> SQL> SQL> insert into emp(emp_id,lastname,firstname,midinit,street,city,state,zip,shortZipCode,area_code,phone,company_name)values
2 (1,"Jones","Joe","J","1 Ave","New York","NY","11202","1111","212", "221-4333","Big Company");
1 row created. SQL> insert into emp(emp_id,lastname,firstname,midinit,street,city,state,zip,shortZipCode,area_code,phone,company_name)values
2 (2,"Smith","Sue","J","1 Street","New York","NY","11444","1111","212", "436-6773","Little Company");
1 row created. SQL> insert into emp(emp_id,lastname,firstname,midinit,street,city,state,zip,shortZipCode,area_code,phone,company_name)values
2 (3,"X","Peggy","J","1 Drive","New York","NY","45502","2222","212", "234-4444","Medium Company");
1 row created. SQL> SQL> create or replace view phone_list as
2 select emp_id, firstname || " " || midinit || ". " || lastname as name,"(" || area_code || ")" || phone as telephone# 3 from emp;
View created. SQL> SQL> SQL> SQL> desc phone_list
Name Null? Type ----------------------------------------------------------------------------------------------------- -------- -------------------------------------------------------------------- EMP_ID NOT NULL NUMBER(38) NAME VARCHAR2(39) TELEPHONE# VARCHAR2(13)
SQL> select * from phone_list;
EMP_ID NAME TELEPHONE#
--------------------------------------- -------------
1 Joe J. Jones (212)221-4333 2 Sue J. Smith (212)436-6773 3 Peggy J. X (212)234-4444
3 rows selected. SQL> create synonym phones for phone_list; Synonym created. SQL> desc phones
Name Null? Type ----------------------------------------------------------------------------------------------------- -------- -------------------------------------------------------------------- EMP_ID NOT NULL NUMBER(38) NAME VARCHAR2(39) TELEPHONE# VARCHAR2(13)
SQL> select * from phones;
EMP_ID NAME TELEPHONE#
--------------------------------------- -------------
1 Joe J. Jones (212)221-4333 2 Sue J. Smith (212)436-6773 3 Peggy J. X (212)234-4444
3 rows selected. SQL> SQL> select view_name from user_views; VIEW_NAME
EMP_HQ V AVG_SAL EMPDEPT_V DEPT_SAL ALL_ORACLE_ERRORS INVENTORY_VIE TOP_EMP EMP_BONUS SHARED PHONE_LIST 11 rows selected. SQL> SQL> select synonym_name, table_name from user_synonyms; SYNONYM_NAME TABLE_NAME
------------------------------
PHONES PHONE_LIST 1 row selected. SQL> SQL> SQL> drop synonym phones ; Synonym dropped. SQL> SQL> SQL> SQL> drop table emp; Table dropped.</source>
Creating a public synonym
<source lang="sql">
SQL> SQL> CREATE TABLE product (
2 product_name VARCHAR2(25) PRIMARY KEY, 3 product_price NUMBER(4,2), 4 quantity_on_hand NUMBER(5,0), 5 last_stock_date DATE 6 );
Table created. SQL> SQL> INSERT INTO product VALUES ("Product 1", 99, 1, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 2", 75, 1000, "15-JAN-02"); 1 row created. SQL> INSERT INTO product VALUES ("Product 3", 50, 100, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 4", 25, 10000, null); 1 row created. SQL> INSERT INTO product VALUES ("Product 5", 9.95,1234, "15-JAN-04"); 1 row created. SQL> INSERT INTO product VALUES ("Product 6", 45, 1, TO_DATE("December 31, 2008, 11:30 P.M.","Month dd, YYYY, HH:MI P.M.")); 1 row created. SQL> SQL> SQL> SQL> CREATE PUBLIC SYNONYM product FOR product; Synonym created. SQL> SQL> drop PUBLIC SYNONYM product; Synonym dropped. SQL> SQL> SQL> drop table product; Table dropped. SQL> SQL></source>
Creating a synonym for a table
<source lang="sql">
SQL> SQL> SQL> CREATE TABLE product (
2 product_name VARCHAR2(25) PRIMARY KEY, 3 product_price NUMBER(4,2), 4 quantity_on_hand NUMBER(5,0), 5 last_stock_date DATE 6 );
Table created. SQL> SQL> INSERT INTO product VALUES ("Product 1", 99, 1, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 2", 75, 1000, "15-JAN-02"); 1 row created. SQL> INSERT INTO product VALUES ("Product 3", 50, 100, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 4", 25, 10000, null); 1 row created. SQL> INSERT INTO product VALUES ("Product 5", 9.95,1234, "15-JAN-04"); 1 row created. SQL> INSERT INTO product VALUES ("Product 6", 45, 1, TO_DATE("December 31, 2008, 11:30 P.M.","Month dd, YYYY, HH:MI P.M.")); 1 row created. SQL> SQL> SQL> SQL> SELECT * FROM prod; SELECT * FROM prod
*
ERROR at line 1: ORA-00942: table or view does not exist
SQL> SQL> SQL> CREATE SYNONYM prod FOR product; Synonym created. SQL> SQL> SELECT * FROM prod; PRODUCT_NAME PRODUCT_PRICE QUANTITY_ON_HAND LAST_STOC
------------- ---------------- ---------
Product 1 99 1 15-JAN-03 Product 2 75 1000 15-JAN-02 Product 3 50 100 15-JAN-03 Product 4 25 10000 Product 5 9.95 1234 15-JAN-04 Product 6 45 1 31-DEC-08 6 rows selected. SQL> SQL> SQL> drop SYNONYM prod; Synonym dropped. SQL> SQL> drop table product; Table dropped. SQL></source>
Describe a synonym
<source lang="sql">
SQL> SQL> create table employees(
2 empno NUMBER(4) 3 , ename VARCHAR2(8) 4 , init VARCHAR2(5) 5 , job VARCHAR2(8) 6 , mgr NUMBER(4) 7 , bdate DATE 8 , msal NUMBER(6,2) 9 , comm NUMBER(6,2) 10 , deptno NUMBER(2) ) ;
Table created. SQL> SQL> SQL> insert into employees values(1,"Jason", "N", "TRAINER", 2, date "1965-12-18", 800 , NULL, 10); 1 row created. SQL> insert into employees values(2,"Jerry", "J", "SALESREP",3, date "1966-11-19", 1600, 300, 10); 1 row created. SQL> insert into employees values(3,"Jord", "T" , "SALESREP",4, date "1967-10-21", 1700, 500, 20); 1 row created. SQL> insert into employees values(4,"Mary", "J", "MANAGER", 5, date "1968-09-22", 1800, NULL, 20); 1 row created. SQL> insert into employees values(5,"Joe", "P", "SALESREP",6, date "1969-08-23", 1900, 1400, 30); 1 row created. SQL> insert into employees values(6,"Black", "R", "MANAGER", 7, date "1970-07-24", 2000, NULL, 30); 1 row created. SQL> insert into employees values(7,"Red", "A", "MANAGER", 8, date "1971-06-25", 2100, NULL, 40); 1 row created. SQL> insert into employees values(8,"White", "S", "TRAINER", 9, date "1972-05-26", 2200, NULL, 40); 1 row created. SQL> insert into employees values(9,"Yellow", "C", "DIRECTOR",10, date "1973-04-27", 2300, NULL, 20); 1 row created. SQL> insert into employees values(10,"Pink", "J", "SALESREP",null,date "1974-03-28", 2400, 0, 30); 1 row created. SQL> SQL> create synonym e for employees; Synonym created. SQL> SQL> describe e
Name Null? Type ----------------------------------------------------- -------- ------------------------------------ EMPNO NUMBER(4) ENAME VARCHAR2(8) INIT VARCHAR2(5) JOB VARCHAR2(8) MGR NUMBER(4) BDATE DATE MSAL NUMBER(6,2) COMM NUMBER(6,2) DEPTNO NUMBER(2)
SQL> SQL> drop table employees; Table dropped. SQL> SQL> drop synonym e; Synonym dropped.</source>
Dropping a public synonym
<source lang="sql">
SQL> SQL> CREATE TABLE product (
2 product_name VARCHAR2(25) PRIMARY KEY, 3 product_price NUMBER(4,2), 4 quantity_on_hand NUMBER(5,0), 5 last_stock_date DATE 6 );
Table created. SQL> SQL> INSERT INTO product VALUES ("Product 1", 99, 1, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 2", 75, 1000, "15-JAN-02"); 1 row created. SQL> INSERT INTO product VALUES ("Product 3", 50, 100, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 4", 25, 10000, null); 1 row created. SQL> INSERT INTO product VALUES ("Product 5", 9.95,1234, "15-JAN-04"); 1 row created. SQL> INSERT INTO product VALUES ("Product 6", 45, 1, TO_DATE("December 31, 2008, 11:30 P.M.","Month dd, YYYY, HH:MI P.M.")); 1 row created. SQL> SQL> SQL> SQL> CREATE PUBLIC SYNONYM product FOR product; Synonym created. SQL> SQL> drop PUBLIC SYNONYM product; Synonym dropped. SQL> SQL> SQL> drop table product; Table dropped.</source>
Dropping a synonym
<source lang="sql">
SQL> SQL> SQL> CREATE TABLE product (
2 product_name VARCHAR2(25) PRIMARY KEY, 3 product_price NUMBER(4,2), 4 quantity_on_hand NUMBER(5,0), 5 last_stock_date DATE 6 );
Table created. SQL> SQL> INSERT INTO product VALUES ("Product 1", 99, 1, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 2", 75, 1000, "15-JAN-02"); 1 row created. SQL> INSERT INTO product VALUES ("Product 3", 50, 100, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 4", 25, 10000, null); 1 row created. SQL> INSERT INTO product VALUES ("Product 5", 9.95,1234, "15-JAN-04"); 1 row created. SQL> INSERT INTO product VALUES ("Product 6", 45, 1, TO_DATE("December 31, 2008, 11:30 P.M.","Month dd, YYYY, HH:MI P.M.")); 1 row created. SQL> SQL> SQL> SQL> SELECT * FROM prod; SELECT * FROM prod
*
ERROR at line 1: ORA-00942: table or view does not exist
SQL> SQL> SQL> CREATE SYNONYM prod FOR product; Synonym created. SQL> SQL> SELECT * FROM prod; PRODUCT_NAME PRODUCT_PRICE QUANTITY_ON_HAND LAST_STOC
------------- ---------------- ---------
Product 1 99 1 15-JAN-03 Product 2 75 1000 15-JAN-02 Product 3 50 100 15-JAN-03 Product 4 25 10000 Product 5 9.95 1234 15-JAN-04 Product 6 45 1 31-DEC-08 6 rows selected. SQL> SQL> SQL> drop SYNONYM prod; Synonym dropped. SQL> SQL> drop table product; Table dropped. SQL></source>
Public Synonyms
Even though a public synonym has been created for schemaName.tableName, a user still needs object privileges on that table to actually access the table.
<source lang="sql">
CREATE PUBLIC SYNONYM products FOR schemaName.tableName;</source>
Query a table by selecting its synonym
<source lang="sql">
SQL> SQL> create table employees(
2 empno NUMBER(4) 3 , ename VARCHAR2(8) 4 , init VARCHAR2(5) 5 , job VARCHAR2(8) 6 , mgr NUMBER(4) 7 , bdate DATE 8 , msal NUMBER(6,2) 9 , comm NUMBER(6,2) 10 , deptno NUMBER(2) ) ;
Table created. SQL> SQL> SQL> insert into employees values(1,"Jason", "N", "TRAINER", 2, date "1965-12-18", 800 , NULL, 10); 1 row created. SQL> insert into employees values(2,"Jerry", "J", "SALESREP",3, date "1966-11-19", 1600, 300, 10); 1 row created. SQL> insert into employees values(3,"Jord", "T" , "SALESREP",4, date "1967-10-21", 1700, 500, 20); 1 row created. SQL> insert into employees values(4,"Mary", "J", "MANAGER", 5, date "1968-09-22", 1800, NULL, 20); 1 row created. SQL> insert into employees values(5,"Joe", "P", "SALESREP",6, date "1969-08-23", 1900, 1400, 30); 1 row created. SQL> insert into employees values(6,"Black", "R", "MANAGER", 7, date "1970-07-24", 2000, NULL, 30); 1 row created. SQL> insert into employees values(7,"Red", "A", "MANAGER", 8, date "1971-06-25", 2100, NULL, 40); 1 row created. SQL> insert into employees values(8,"White", "S", "TRAINER", 9, date "1972-05-26", 2200, NULL, 40); 1 row created. SQL> insert into employees values(9,"Yellow", "C", "DIRECTOR",10, date "1973-04-27", 2300, NULL, 20); 1 row created. SQL> insert into employees values(10,"Pink", "J", "SALESREP",null,date "1974-03-28", 2400, 0, 30); 1 row created. SQL> SQL> SQL> SQL> create synonym e for employees; Synonym created. SQL> SQL> SQL> select * from e;
EMPNO ENAME INIT JOB MGR BDATE MSAL COMM DEPTNO
-------- ----- -------- ---------- --------- ---------- ---------- ----------
1 Jason N TRAINER 2 18-DEC-65 800 10 2 Jerry J SALESREP 3 19-NOV-66 1600 300 10 3 Jord T SALESREP 4 21-OCT-67 1700 500 20 4 Mary J MANAGER 5 22-SEP-68 1800 20 5 Joe P SALESREP 6 23-AUG-69 1900 1400 30 6 Black R MANAGER 7 24-JUL-70 2000 30 7 Red A MANAGER 8 25-JUN-71 2100 40 8 White S TRAINER 9 26-MAY-72 2200 40 9 Yellow C DIRECTOR 10 27-APR-73 2300 20 10 Pink J SALESREP 28-MAR-74 2400 0 30
10 rows selected. SQL> SQL> drop table employees; Table dropped. SQL> SQL> drop synonym e; Synonym dropped. SQL></source>
Seeing SYNONYM in the Oracle data dictionary
<source lang="sql">
SQL> SQL> SQL> CREATE TABLE product (
2 product_name VARCHAR2(25) PRIMARY KEY, 3 product_price NUMBER(4,2), 4 quantity_on_hand NUMBER(5,0), 5 last_stock_date DATE 6 );
Table created. SQL> SQL> INSERT INTO product VALUES ("Product 1", 99, 1, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 2", 75, 1000, "15-JAN-02"); 1 row created. SQL> INSERT INTO product VALUES ("Product 3", 50, 100, "15-JAN-03"); 1 row created. SQL> INSERT INTO product VALUES ("Product 4", 25, 10000, null); 1 row created. SQL> INSERT INTO product VALUES ("Product 5", 9.95,1234, "15-JAN-04"); 1 row created. SQL> INSERT INTO product VALUES ("Product 6", 45, 1, TO_DATE("December 31, 2008, 11:30 P.M.","Month dd, YYYY, HH:MI P.M.")); 1 row created. SQL> SQL> SQL> SQL> CREATE PUBLIC SYNONYM product FOR product; Synonym created. SQL> SQL> SQL> SELECT table_name, SUBSTR(comments, 1, 45) FROM dict WHERE SUBSTR(comments, 1, 7) <> "Synonym" and rownum < 50;
SQL> SQL> drop PUBLIC SYNONYM product; Synonym dropped. SQL> SQL> drop table product; Table dropped. SQL></source>
Synonyms
You can access tables in another schema by specifying the schema name followed by the table.
You can avoid having to enter the schema name by creating a synonym for a table.
<source lang="sql">
CREATE SYNONYM customers FOR store.customers;</source>