一、同义词 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
【案例】Evaluate the following CREATE SEQUENCE statement:
CREATE SEQUENCE seq1
START WITH 100
INCREMENT BY 10
MAXVALUE 200
CYCLE
NOCACHE?
The sequence SEQ1 has generated numbers up to the maximum limit of 200. You issue the following SQL statement:
SELECT seq1.nextval FROM dual? //当前已经是最大值200,请问,nextval将是多少?
What is displayed by the SELECT statement?
A. 1
B. 10
C. 100
D. an error
answer:A
【扫盲】
has generated numbers up to the maximum limit of 200.:当前已经获得最大值是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