建立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操作
--為hr的copy_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;
--授予物件許可權給其它使用者
--將hr的dept80表的查詢許可權授給demo
grant select on dept80 to demo;
--將hr的dept80表的last_name和annsal列的修改許可權授給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的訪問hr的dept80
--表的許可權同時被廢除。
--系統許可權也可以進行傳遞授權,使用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');
--2、alter 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));
--3、alter 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查詢資料庫最新的scn:5716081
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');
--建立使用臨時表
--臨時表是一個表,它的資料只在事務或會話期間存在。
--在臨時表中的資料對於會話是私有的,這意味著每個會話只
--能看見和修改它自己的資料。
--可以為臨時表建立索引。索引也是臨時的。
--也可以在臨時表上建立檢視或觸發器。
--臨時表和它們的索引在建立時不自動分配段。
--當資料第一次被插入時才分配臨時段。
--臨時表有兩種:事務級的和會話級的
--1、SESSION級臨時表
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';