同义词,序列和视图

一、同义词 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
 

正文:

一、同义词 synonym

1CREATE [PUBLIC] SYNONYM synonym For schema.object

2,同义词分两种:公有同义词和私有同义词

公有同义词:拥有者是public用户,所有public组的用户都可以访问它!

私有同义词:拥有者是创建该同义词的用户。默认创建的就是私有同义词

3,举例,创建synonym

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;

4,举例,通过创建数据库连接和公有同义词来透明访问远程数据库

  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;

5,同义词的作用

·隐藏对象的名称和所有者:

  ·为分布式数据库的远程对象提供了位置透明性:

  ·访问其他数据库时,要首先建立数据库连结:

Tips:当公有对象和私有对象同名时(因为数据不同的用户,所以可以),以私有对象优先。(类似于局部变量)

6,与同义词相关的数据字典

SQL> desc dba_synonyms/ user_synonyms/ all_synonyms

 

7,删除同义词

  SQL> drop synonym bkeep.emp;

SQL> drop public synonym pub_emp;

二、序列sequence

1,什么是序列

sequenceoracle中的一个对象,它可以顺序产生连续的数字。

 

2,创建序列

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             //设置最大值,此处表示默认1027次幂。MAXVALUE 10

  NOMINVALUE              //设置最小值,此处表示默认-1026次幂。MINVALUE 1

  NOCYCLE                 //或者CYCLE;表示序列达到最大或者最小(降序)后,要不要从头开始

  CACHE 10;                 //默认CACHE 20, 事先分配多少序列号放在内存中,提高速度。

  

3,访问序列:

  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

answerA

【扫盲】

has generated numbers up to the maximum limit of 200.:当前已经获得最大值是200

【知识点】

这个题很值得注意,因为即便是start with 100 cycle的时候还是从1开始计数

 

4,使用序列:

  SQL> insert into t values(seq.nextval);

5,修改序列:

SQL> alter sequence seq     //重新指定各个参数,不能修改start with;除非删除重建

6,删除序列:

SQL> drop sequence seq;

7,数据字典:

dba_sequences

user_sequences

all_sequences

 

三、视图view:

1,语法

SQL> CREATE [OR REPLACE][FORCE/ NOFORCE] VIEW AS

  Create view mytable

  As

  Select first_name||’,’||last_name

  from hr.employees;

2,【真实场景】

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隐藏数据的复杂性

3,数据字典:

dba_views

4,区别create create or replace

  如果删掉重建,会有什么缺点?会把关联的授权全部删掉。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    //删除视图

5,视图中增加约束:

  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’);

6,验证视图有效性:

  基本表的一些改变可能会导致视图无效:

  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;

7FORCE 选项:

  强制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;

8,通过视图进行更新和删除:

  ·类似于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’)

  ·尝试更新emailname

  SQL> update hr.company_phone_book

  set name=‘Chen, Bkeep’

where emp_id=100

9,使用instead of 触发器更新视图:

  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;

10With check option 约束:

  作用:阻止更新不能通过视图访问的数据。

  试验:

  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的数据,被禁止。

11,【实验】关于前5

  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

你可能感兴趣的:(oracle,sql,Date,数据库,table,email)