--建立使用同義詞數據庫
--同義詞就是給表、視圖等對象取得別名,用於簡化對其的訪問服務器
--分爲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操做
--爲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';