1. 程式人生 > >建立Oracle synonym 詳解

建立Oracle synonym 詳解

 

--建立使用同義詞

--同義詞就是給表、檢視等物件取得別名,用於簡化對其的訪問

 

--分為2種:

--私有同義詞:使用者自己建立自己使用的

--公共同義詞dba建立,給其它使用者使用的

 

--dept_sum_vu檢視建立一個同義詞

--不使用public關鍵字建立的同義詞就叫做私有同義詞

create synonym d_sum for dept_sum_vu;

 

--通過同義詞訪問檢視

select * from d_sum;

 

--SQL 錯誤: ORA-01031: 許可權不足

create public synonym hremp1 for employees;  

 

--以下操作由sys操作  

--hrcopy_emp表建立公共同義詞

create public synonym hrcemp1 for hr.copy_emp;

 

--將訪問同義詞的許可權給所有使用者  

grant select on hrcemp1 to public;

 

--許可權控制:

--schema是表、檢視、序列等物件的集合。

--schema被一個數據庫使用者擁有並且和使用者有相同的名字。

 

--以下操作由sys完成

--建立新使用者

create user demo identified by demo;

 

--授予demo登入到資料庫的許可權

grant create session to demo;

 

--授予demo建立各種物件的許可權

grant create table,create view,create sequence,create procedure to demo;  

 

--為了簡化許可權管理,使用角色

--1、建立角色

create role manager;

 

--2、給角色授權

grant create table,create view to manager;

 

--3、將角色授給使用者,那麼使用者就擁有了角色擁有的許可權  

grant manager to demo;

 

--修改自己的口令

--hr操作

alter user hr identified by hr;

 

--授予物件許可權給其它使用者

 

--hrdept80表的查詢許可權授給demo

grant select on dept80 to demo;

 

--hrdept80表的last_nameannsal列的修改許可權授給demo

grant update(last_name,annsal) on dept80 to demo;

 

--授權時使用with grant option選項

--它的含義是:允許被授權的使用者繼續將同樣的許可權授給其它使用者

 

--以下由sys操作

create user demo1 identified by demo1;

 

grant create session to demo1;

 

--以下由hr操作

grant select on dept80 to demo with grant option;

 

--以下由demo操作

grant select on hr.dept80 to demo1 with grant option;

 

----以下由hr操作

--查詢資料字典得到有關許可權的資訊

 

DESC role_sys_privs;

 

--檢視角色具備的系統許可權

select * from role_sys_privs;

 

--檢視自己把哪些物件的訪問許可權授給了哪些使用者

select * from user_tab_privs_made;

 

--檢視其它使用者把哪些物件的訪問許可權授給了自己

select * from user_tab_privs_recd;  

 

--廢除物件許可權

revoke select on dept80 from demo;

 

--注意:demo通過傳遞授權授給demo1的訪問hrdept80

--表的許可權同時被廢除。

 

--系統許可權也可以進行傳遞授權,使用with admin option選項

--廢除系統許可權時,通過傳遞授權授予的系統許可權不會被同時廢除

 

 

--管理schema物件

--使用alter table語句新增、修改、刪除列

 

  bonus number constraint bonus_ck 

--給表新增一個新的列

--1)不能指定列要出現在哪裡。新列成為最後的列。

--2)當新增列時,如果表中已經包含了行,對所有的行來講,

--新的列被初始化為null,或者賦予預設值。

 

--dept80表新增一個job_id

alter table dept80 add (job_id varchar2(9));

 

alter table dept80 add (job_id1 varchar2(9) default 'abc');

 

--2alter table...modify

--修改表中已有列的定義

--列修改包括改變列的資料型別、大小和預設值。

--可增加數字列的寬度或精度

--可增加字元列的寬度

 

--可減少列的寬度,如果:

--  列只包含null

--  表沒有行

--  減少列寬度不少於列中已有的值

 

--如果列中只包含null值可改變資料型別。

 

--列的預設值的改變隻影響後續插入的行

 

--dept80表的last_name列的寬度增加到30

alter table dept80 modify (last_name varchar2(30));

 

--dept80表的last_name列的寬度減少到20

alter table dept80 modify (last_name varchar2(20));

 

--dept80表的last_name列的寬度減少到8

--SQL 錯誤: ORA-01441: 無法減小列長度, 因為一些值過大

alter table dept80 modify (last_name varchar2(8));

 

--dept80表的annsal列的寬度減少到10

--SQL 錯誤: ORA-01440: 要減小精度或標度, 則要修改的列必須為空

alter table dept80 modify (annsal number(10));

 

--3alter table...drop或者alter table...drop column

--使用帶DROP COLUMN子句的ALTER TABLE語句可以刪除一個列。

--列可以包含或不包含資料。

--一次只刪除一列

--表必須至少還留一列

--列被刪除後不能被恢復。

--列不能被刪除,如果它是約束或索引鍵的一部分,除非增加了級聯選項

 

--刪除列要花一點時間,如果列有大量的值。在這種情況下,

--最好把列設定為未使用的,然後在系統使用者較少時再刪除

 

alter table dept80 drop column job_id1;

 

--將列標記為未使用的

--未使用的列作為被刪除的列對待,即使列的資料還保留在錶行中。

 

--在列被標記為未使用的之後,你不能訪問那個列。

--SELECT *查詢不從未使用的列中檢索資料。

 

--DESCRIBE命令執行時,未使用的列的名字和型別不被顯示,

--並且你可以給表新增一個新列,其名字和未使用的列一樣。

 

--SET UNUSED 資訊儲存在USER_UNUSED_COL_TABS檢視中。

 

--特別注意:該操作沒有可逆操作

 

alter table dept80 set unused (job_id);

 

--檢視未使用的列的資訊

select * from user_unused_col_tabs;

 

alter table dept80 drop unused columns;

 

--使用alter table語句管理約束:

--可以新增、刪除、啟用或禁用一個約束,但是不能修改約束

--通過使用MODIFY子句,可以給一個已有的列新增NOT NULL約束

 

--建立emp2表,先新增主鍵約束,再新增外來鍵約束

create table emp2 as select * from employees; as select * from employees;

 

alter table emp2 add constraint emp2_empid_pk  primary key(employee_id);

 

alter table emp2 add constraint emp2_managerid_fk  foreign key(manager_id) references emp2(employee_id);

 

--使用延遲約束特性

--預設情況下,約束都是立即檢查的:即,當dml語句一執行完畢,

--oracle會立即檢查操作結果是否違反約束,如果違反則丟擲異常。

--可以把約束檢查的時間推遲到事務提交的時候再檢查,這叫做

--延遲約束檢查。

 

--和延遲約束有關的關鍵字:

--DEFERRABLE(可延遲的)、

--INITIALLY DEFERRED(初始化延遲的) 、

--INITIALLY IMMEDIATE(初始化立即的),這是預設值

--後面的兩個值是配合DEFERRABLE用的

 

create table emp_new_sal(

  salary number constraint sal_ck 

    check(salary > 100) 

    deferrable initially immediate,

  bonus number constraint bonus_ck 

    check(bonus > 0) 

    deferrable initially deferred

);

 

--測試

--SQL 錯誤: ORA-02290: 違反檢查約束條件 (HR.SAL_CK)

INSERT INTO emp_new_sal VALUES(90,5);

 

--1 行已插入。

INSERT INTO emp_new_sal VALUES(110, -1);

 

--SQL 錯誤: ORA-02091: 事務處理已回退

--ORA-02290: 違反檢查約束條件 (HR.BONUS_CK)

commit;

 

--設定DEFERRED狀態給所有約束。

SET CONSTRAINTS ALL DEFERRED;

 

----1 行已插入。

INSERT INTO emp_new_sal VALUES(90,5);

 

--1 行已插入。

INSERT INTO emp_new_sal VALUES(110, -1);

 

--SQL 錯誤: ORA-02091: 事務處理已回退

--ORA-02290: 違反檢查約束條件 (HR.SAL_CK)

commit;

 

 

--禁用約束

--通過使用帶DISABLE子句的ALTER TABLE語句禁用一個約束而不刪除它

--語法:

--    ALTER   TABLE   table

--  DISABLE CONSTRAINT constraint [CASCADE];

 

--禁用emp2表的外來鍵約束

alter table emp2

  disable constraint emp2_managerid_fk;

 

--通過使用帶ENABLE子句的ALTER TABLE語句啟用一個約束而不刪除它

--語法:

--ALTER   TABLE      table

--ENABLE  CONSTRAINT constraint;

 

--啟用emp2表的外來鍵約束

alter table emp2

  enable constraint emp2_managerid_fk;

 

----禁用emp2表的主鍵鍵約束

--SQL 錯誤: ORA-02297: 無法禁用約束條件 (HR.EMP2_EMPID_PK) - 存在相關性

alter table emp2

  disable constraint emp2_empid_pk;

 

alter table emp2

  disable constraint emp2_empid_pk cascade;

 

alter table emp2

  enable constraint emp2_empid_pk;

 

--禁用主鍵約束。觀察主鍵索引被自動刪除

--注意:當禁用主鍵或者唯一鍵約束時,為這些約束自動建立的索引

--會被自動刪除。當啟用主鍵或者唯一鍵約束時,Oracle會自動

--為其建立索引

alter table emp2

  disable constraint emp2_empid_pk;

 

alter table emp2

  enable constraint emp2_empid_pk;

 

--如果啟用一個約束,約束應用到表中的所有資料。

 

--刪除約束

--根據名字來刪

alter table emp2

  drop constraint SYS_C0013878;

 

 

--CASCADE CONSTRAINTS選項

--該選項專門配合drop column子句使用。

--當刪除以下列時,需要帶上該選項:

--1)被外來鍵引用的主鍵列

--2)被刪除的列被一個多列約束引用

 

--使用alter table語句將列改名字

alter table emp2

  rename column phone_number

  to phone;

 

--使用alter table語句將約束改名字

alter table emp2

  rename constraint SYS_C0013876

  to emp2_email_nn;  

 

--create table語句中使用using index選項可以指定

--主鍵約束使用指定的索引而不是oracle自動建立的索引

create table new_emp(

  employee_id number(6) 

    primary key using index(

      create index emp_id_idx on new_emp(employee_id)

    ),

  fname varchar2(20),

  lname varchar2(20)

);

 

--禁用主鍵約束。觀察索引未被刪除

alter table new_emp

  disable constraint SYS_C0013883;

 

--啟用主鍵約束。觀察索引未變化

alter table new_emp

  enable constraint SYS_C0013883;

 

drop table new_emp;

 

--指定主鍵使用唯一索引

create table new_emp(

  employee_id number(6) 

    primary key using index(

      create unique index emp_id_idx on new_emp(employee_id)

    ),

  fname varchar2(20),

  lname varchar2(20)

);

 

--禁用主鍵約束。觀察索引被刪除

alter table new_emp

  disable constraint SYS_C0013884;

 

--啟用主鍵約束。觀察索引被自動建立,名字和約束同名

alter table new_emp

  enable constraint SYS_C0013884;

 

--使用基於函式的索引

--如果在查詢的where條件中,經常要對一個函式值進行比較,

--那麼可以在該函式上建一個索引

create table dept2

as select * from departments;

 

create index dept2_dname_idx

  on dept2(department_name);

 

--以下查詢不走上面的索引

select *

  from dept2

  where upper(department_name)='SALES';

 

--建立基於函式的索引

create index dept2_upperdname_idx

  on dept2(upper(department_name));

 

--以下查詢走上面的索引

select *

  from dept2

  where upper(department_name)='SALES';

 

--使用閃回操作

--Oracle為刪除表提供了一個特色。當你刪除一個表時,

--資料庫不立即釋放和表相關的空間。相反,資料庫將表改名

--並將它放入回收站中,以便以後如果你發現誤刪了,

--可以用FLASHBACK TABLE 語句恢復。

--如果你想當發出DROP TABLE語句時,立即釋放和表相關的空間,

--就包含PURGE 子句。

 

--刪除表emp2

drop table emp2;

 

--查詢回收站

select *

  from recyclebin;

 

--從回收站站中恢復誤刪的表

flashback table emp2 to before drop;

 

--徹底刪除表emp2

drop table emp2 purge;

 

--SQL 錯誤: ORA-38305: 物件不在回收站中

flashback table emp2 to before drop;

 

--清空回收站

purge recyclebin;

 

--查詢回收站

select *

  from recyclebin;

 

--第二種閃回操作

--將某個表的內容恢復到事務提交之前的狀態

commit;

 

----sys查詢資料庫最新的scn5716081

select current_scn

  from v$database;

 

delete from dept2;

 

commit;

 

--dept2中的內容閃回到事務提交之前

--SQL 錯誤: ORA-08189: 因為未啟用行移動功能, 不能閃回表

flashback table dept2

  to scn 5716081;

 

--啟用行移動功能

alter table dept2 enable row movement;

 

flashback table dept2

  to scn 5716081;

 

select scn_to_timestamp(5716081)

  from dual;

 

flashback table dept2

  to timestamp 

    to_timestamp('2014-06-20 14:23:52','yyyy-mm-dd hh24:mi:ss');

 

--建立使用臨時表

--臨時表是一個表,它的資料只在事務或會話期間存在。

--在臨時表中的資料對於會話是私有的,這意味著每個會話只

--能看見和修改它自己的資料。

 

--可以為臨時表建立索引。索引也是臨時的。

--也可以在臨時表上建立檢視或觸發器。

 

--臨時表和它們的索引在建立時不自動分配段。

--當資料第一次被插入時才分配臨時段。

 

--臨時表有兩種:事務級的和會話級的

 

--1SESSION級臨時表 

create global temporary table today_sales(sales number)

  on commit preserve rows;

 

insert into today_sales

  values(10000);

 

commit; --提交事務

 

--可以看到行還在臨時表中

select * from today_sales;

 

--斷開連線,重新登入,再次查詢,資料消失

select * from today_sales;

 

--2、事務級臨時表 

create global temporary table cart(sales number)

  on commit delete rows;

 

insert into cart

  values(10000);

 

--可以看到行還在臨時表中

select * from cart;

 

commit; --提交事務

 

--可以看到行已被刪除

select * from cart;

 

--建立使用外部表

--外部表實際上是Oracle的一個數據載入(load)和解除安裝(unload)工具

 

--外部表是一個只讀的表,它的元資料儲存在資料庫中,

--但是它的資料儲存在資料庫外面(作業系統中)。

 

--外部表和普通表的主要區別是外部表是隻讀的。因此,

--不能在外部表上執行DML操作,並且不能在外部表上建立索引。

 

--Oracle伺服器為外部表提供了兩種訪問驅動。

--一個是載入器訪問驅動(名字叫ORACLE_LOADER),只能

--用來做資料匯入;

--另一個ORACLE_DATAPUMP訪問驅動,既可用來匯入資料,

--又可用來匯出資料,使用一種跨平臺的格式。

 

--要使用外部表,首先在作業系統中準備好目錄和檔案(用來載入資料)

--然後在oracle中建立目錄物件

 

--注意:普通使用者沒有建立目錄的許可權,可以由sys

--先授權:grant create any directory to hr;

 

--注意:路徑是絕對的

create or replace directory emp_dir

  as 'D:\emp_dir';

 

--建立外部表

create table oldemp(

  fname varchar2(25),lname varchar2(25)

) organization external(

  type oracle_loader

  default directory emp_dir

  access parameters(

    records delimited by newline

    nobadfile

    nologfile

    fields terminated by ','(

      fname position (1:20) char,

      lname position (22:41) char

    )

  )

  location ('emp.dat')

)

parallel 5

reject limit 200;

 

select * from oldemp;

 

--修改上列:

drop table oldemp;

 

create table oldemp(

  fname varchar2(25),lname varchar2(25)

) organization external(

  type oracle_loader

  default directory emp_dir

  access parameters(

    records delimited by newline

    nobadfile

    nologfile

    fields terminated by ','

  )

  location ('emp.dat')

)

parallel 5

reject limit 200;

 

select * from oldemp;

 

 

--修改上列:

drop table oldemp;

 

create table oldemp(

  fname varchar2(25),lname varchar2(25)

) organization external(

  type oracle_loader

  default directory emp_dir

  access parameters(

    records delimited by newline   

    fields terminated by ','

  )

  location ('emp.dat')

)

parallel 5

reject limit 200;

 

select * from oldemp;

 

--使用oracle_datapump驅動做資料載入和解除安裝

 

--1、將employees表的所有資料匯出到作業系統檔案中

create table emp_ext(

  employee_id,first_name,last_name

) organization external(

  type oracle_datapump

  default directory emp_dir  

  location ('emp1.exp','emp2.exp')

)

parallel 2

as select employee_id,first_name,last_name

   from employees;

 

--資料載入

drop table import_emp;

 

create table import_emp

    ( employee_id number(6),

      first_name  varchar2(20),

      last_name   varchar2(25)

    )

    organization external

    ( type oracle_datapump

      default directory emp_dir

      location ('emp1.exp','emp2.exp')

   );

 

select * from import_emp;

 

--使用資料字典

--資料字典是由Oracle伺服器建立和維護的表和檢視的集合,

--它們包含有關資料庫的資訊。對所有使用者來說它們是重要的工具

 

--因為資料字典是隻讀的,你只能查詢

 

--可以把dictionary檢視作為使用資料字典檢視的入口點。

--它包含了所有可用檢視的名字以及簡單的解釋

select *

  from dictionary;

 

--查詢user_objects檢視得到自己的所有物件的資訊

desc user_objects;

 

select object_name,object_type,created,status

  from user_objects

  order by object_type;

 

--專門查詢自己的表的資訊

desc user_tables;

 

select table_name

  from user_tables;

 

--查詢表列的資訊

desc user_tab_columns;

 

select column_name,data_type,data_length,

       DATA_PRECISION,DATA_SCALE,NULLABLE

  from user_tab_columns

  where table_name='EMPLOYEES';     

 

 

--檢視約束的資訊:2個檢視

--user_constraints: 包含表的所有約束定義

--user_cons_columns:約束定義的列的資訊

 

desc user_constraints;

 

select constraint_name,constraint_type,

       search_condition,r_constraint_name,

       delete_rule,status

  from user_constraints

  where table_name='EMPLOYEES';

 

--查詢employees表中每個約束都定義在哪些列上

select constraint_name,column_name

  from user_cons_columns

  where table_name='EMPLOYEES';