建立Oracle synonym 詳解

 

--建立使用同義詞數據庫

--同義詞就是給表、視圖等對象取得別名,用於簡化對其的訪問服務器

 

--分爲2種:session

--私有同義詞:用戶本身建立本身使用的oracle

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

 

--dept_sum_vu視圖建立一個同義詞函數

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

create synonym d_sum for dept_sum_vu;測試

 

--經過同義詞訪問視圖spa

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';

相關文章
相關標籤/搜索