一、同义词 synonym... 1
1,CREATE [PUBLIC] SYNONYM synonym For schema.object 1
2,同义词分两种:公有同义词和私有同义词... 1
3,举例,创建synonym.. 1
4,举例,通过创建数据库连接和公有同义词来透明访问远程数据库... 2
5,同义词的作用... 2
6,与同义词相关的数据字典... 2
7,删除同义词... 2
二、序列sequence:.... 2
1,什么是序列... 2
2,创建序列... 2
说明:... 2
3,访问序列:... 3
4,使用序列:... 3
5,修改序列:... 3
6,删除序列:... 3
7,数据字典:... 3
三、视图view: 3
1,语法... 3
2,【真实场景】... 3
3,数据字典:... 4
4,区别create 和 create or replace. 4
5,视图中增加约束:... 4
6,验证视图有效性:... 4
7,FORCE 选项:... 5
8,通过视图进行更新和删除:... 5
9,使用instead of 触发器更新视图:... 5
10,With check option 约束:... 5
11,【实验】关于前5名... 6
正文:
公有同义词:拥有者是public用户,所有public组的用户都可以访问它!
私有同义词:拥有者是创建该同义词的用户。默认创建的就是私有同义词
SQL> conn bkeep/zbb
Connected.
SQL> select count(*) from hr.employees;
SQL> create synonym emp for hr.employees; //默认属于bkeep用户,是bkeep的私有对象private
SQL> select count(*) from emp;
SQL> CREATE DATABASE LINK test_link CONNECT TO zbb IDENTIFIED BY pass USING 'mc';
SQL> Select count(*) from hr.employees@test_link;
SQL> create synonym link_emp for hr.employees@test_link;
SQL> select count(*) from link_emp;
create public synonym pub_emp for hr.employees;
·隐藏对象的名称和所有者:
·为分布式数据库的远程对象提供了位置透明性:
·访问其他数据库时,要首先建立数据库连结:
Tips:当公有对象和私有对象同名时(因为数据不同的用户,所以可以),以私有对象优先。(类似于局部变量)
SQL> desc dba_synonyms/ user_synonyms/ all_synonyms
SQL> drop synonym bkeep.emp;
SQL> drop public synonym pub_emp;
sequence是oracle中的一个对象,它可以顺序产生连续的数字。
SQL> run
1 create sequence seq
2 increment by 1
3 start with 10
4 maxvalue 1000
5 cycle //达到1000后重新计数
6* cache 10
Sequence created.
CREATE SEQUENCE seq //也是属于某个用户的,以下参数均可省略,使用默认值。
INCREMENT BY 1 //指定序列之间的间隔,正负整数;默认1,正为升序,负为降序。
START WITH 1 //第一个序列号,默认=MINVALUE
NOMAXVALUE //设置最大值,此处表示默认10的27次幂。MAXVALUE 10
NOMINVALUE //设置最小值,此处表示默认-10的26次幂。MINVALUE 1
NOCYCLE //或者CYCLE;表示序列达到最大或者最小(降序)后,要不要从头开始
CACHE 10; //默认CACHE 20, 事先分配多少序列号放在内存中,提高速度。
oracle为序列提供了两个伪列,可以看作其属性。
Nextval: 根据increment by得到的一个新的序列值。每次执行都会得到一个新值。
Currval: current value, 当前值,已经被取得的值。
SQL> select seq.nextval from dual;
NEXTVAL
----------
10
SQL> run
1* select seq.nextval from dual
NEXTVAL
----------
11
SQL> select seq.currval from dual;
CURRVAL
----------
14
【案例】EvaluatethefollowingCREATESEQUENCEstatement:
CREATESEQUENCEseq1
STARTWITH100
INCREMENTBY10
MAXVALUE200
CYCLE
NOCACHE?
ThesequenceSEQ1hasgeneratednumbersuptothemaximumlimitof200.YouissuethefollowingSQLstatement:
SELECTseq1.nextvalFROMdual? //当前已经是最大值200,请问,nextval将是多少?
WhatisdisplayedbytheSELECTstatement?
A.1
B.10
C.100
D.anerror
answer:A
【扫盲】
hasgeneratednumbersuptothemaximumlimitof200.:当前已经获得最大值是200
【知识点】
这个题很值得注意,因为即便是start with 100 ,cycle的时候还是从1开始计数
SQL> insert into t values(seq.nextval);
SQL> alter sequence seq … //重新指定各个参数,不能修改start with;除非删除重建
SQL> drop sequence seq;
dba_sequences
user_sequences
all_sequences
SQL> CREATE [OR REPLACE][FORCE/ NOFORCE] VIEW AS
Create view mytable
As
Select first_name||’,’||last_name
from hr.employees;
1). desc考察hr.employees,看作一个公司的员工信息数据库表,简单说明
2). 目标:实现每个员工都可以访问公司中所有雇员的name, email, phone_number,方便通讯
3). 方案:
a) 赋予所有员工访问hr.employees表的权限?salary
b) 建立一个只包含合适字段的视图,然后赋予所有员工访问这个视图的权限,而不是表的权限。
4). Alter user hr account unlock;
Conn hr/hr
SQL> Create view company_phone_book as
Select first_name||’, ‘||last_name name, email, phone_number
From employees;
SQL> Grant select on company_phone_book to public;
SQL> Desc company_phone_book
SQL> Select * from company_phone_book;
name隐藏数据的复杂性
dba_views
如果删掉重建,会有什么缺点?会把关联的授权全部删掉。Create or replace view保留原有授权。
SQL> Create or replace view company_phone_book as
Select employee_id emp_id,
first_name||’,’||last_name name, email, phone_number
From employees;
SQL> Desc company_phone_book //查看视图结构
SQL> Drop view company_phone_book //删除视图
SQL> create view yearly_hire_totals as
select to_char(hire_date,’YYYY’) year,
count(*) total
from hr.employees
group by to_char(hire_date,’YYYY’)
order by to_char(hire_date,’YYYY’);
基本表的一些改变可能会导致视图无效:
1) 改变出现在视图中列的名称,或删掉列
2) 删除构建视图的基本表或视图
【实验】使视图无效,并重新编译并使其有效:
1) 基本表:
SQL> create table base(id number,data varchar2(200));
SQL> insert into base values(1,’abc’);
SQL> commit;
2) view:
SQL> create view view_b as
select id view_id, data view_data from t;
SQL> select * from view_b;
3) 更新基本表:
SQL> alter table base modify(id number,data varchar2(255));
SQL> alter table base add(data2 varchar2(100));
4) 视图无效:
SQL> select object_name, status from dba_objects where object_name=upper(‘view_b’)
5) 使视图有效:只需要从视图中选取即可, oracle会自动对视图编译
SQL> select * from view_b;
6) 手动编译:
SQL> alter view view_b compile;
强制ORACLE接受无效的视图定义:
1) 比如开发过程中A负责建立基本表,B负责建立视图。这样B不必依赖于A的工作进度就可以将视图建立并编译进数据库。
2) 或者B需要建立在A用户表上视图,但是还暂时没有对A用户表select 的权限,可以先建立,等待授权后再使用。
SQL> Create view invalid_view as
Select * from table_not_exist;
SQL> Create force view invalid_view as
Select * from table_not_exist;
·类似于company_phone_book是可以跟新的。
·可以通过dba_updatable_columns查看那些列可以做那些更新;
SQL> desc hr.company_phone_book
SQL> select * from dba_updatable_columns where table_name=upper(‘company_phone_book’)
·尝试更新email和name
SQL> update hr.company_phone_book
set name=‘Chen, Bkeep’
where emp_id=100
SQL> create trigger update_name_company_phone_book
INSTEAD OF
Update on hr.company_phone_book
Begin
Update hr.employees
Set employee_id=:new.emp_id,
First_name=substr(:new.name, instr(:new.name,’,’)+2),
last_name= substr(:new.name,1,instr(:new.name,’,’)-1),
phone_number=:new.phone_number,
email=:new.email
where employee_id=:old.emp_id;
end;
作用:阻止更新不能通过视图访问的数据。
试验:
1) 建立视图,只能看到department_id=10的雇员
SQL> create view department_10 as
select * from hr.employees where department_id=10
With check option
2) 选择:select employee_id,first_name,last_name from department_10;
3) 查看可更新列:
SQL> select * from dba_updatable_columns
where table_name=upper(‘department_10’)
4) 尝试将此人移动到部门20
SQL> update department_10
set department_id=20
where employee_id=200
报错!!
这个视图限制我们只能访问department=10的数据,我们要通过视图修改department=20的数据,被禁止。
1) 谁是公司前5名的雇员
SQL> select last_name,hire_date
from hr.employees
order by hire_date;
2) 只想取回前五名数据呢?
SQL> select last_name,hire_date
from hr.employees
where rownum<6
order by hire_date;
结果不正确,先取了前5条数据,再排序
3)SQL> select last_name,hire_date
from (select last_name,hire_date
from hr.employees
order by hire_date)
where rownum<6