ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【031】同义词、序列与视图

【031】同义词、序列与视图

原创 Linux操作系统 作者:bkeep 时间:2010-06-15 13:29:52 0 删除 编辑

目录:

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

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

 

 

 



Link URL: http://bkeep.blog.163.com/blog/static/123414290201051441447358

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22238176/viewspace-665360/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 【oracle】hash
下一篇: 【031】Oracle 约束
请登录后发表评论 登录
全部评论

注册时间:2009-07-31

  • 博文量
    8
  • 访问量
    10084