技术开发 频道

Oracle中的概念:同义词、序列与视图

  数据字典:

  dba_views

  text字段,long

  select text from dba_views where view_name=upper(’company_phone_book’)

  改变视图定义:

  新需求:想要在现有视图上增加员工的ID号(employee_id)

  Create view company_phone_book as

  Select employee_id emp_id,

  first_name||’,’||last_name name, email, phone_number

  From employees;

  报错;

  如果删掉重建,会有什么缺点?会把关联的授权全部删掉。Create or replace view保留原有授权。

  Create or replace view company_phone_book as

  Select employee_id emp_id,

  first_name||’,’||last_name name, email, phone_number

  From employees;

  Desc company_phone_book

  Drop view company_phone_book

  视图中增加约束:

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

  联接视图:

  desc hr.emp_details_view

  set long 5000

  select text from dba_views where view_name=upper(‘emp_details_view’)

  with read only

  验证视图有效性:

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

  1) 改变出现在视图中列的名称,或删掉列

  2) 删除构建视图的基本表或视图

  [试验]使视图无效,并重新编译并使其有效:

  1) 基本表:create table base(id number,data varchar2(200));

  insert into base values(1,’abc’); commit;

  2) view: create view view_b as

  select id view_id, data view_data from t;

  select * from view_b;

  3) 更新基本表: alter table base modify(id number,data varchar2(255));

  alter table base add(data2 varchar2(100));

  4) 视图无效:select object_name, status from dba_objects where object_name=upper(‘view_b’)

  5) 使视图有效:只需要从视图中选取即可, oracle会自动对视图编译

  select * from view_b;

  6) 手动编译: alter view view_b compile;

  FORCE 选项:

  强制ORACLE接受无效的视图定义:

  1) 比如开发过程中A负责建立基本表,B负责建立视图。这样B不必依赖于A的工作进度就可以将视图建立并编译进数据库。

  2) 或者B需要建立在A用户表上视图,但是还暂时没有对A用户表select 的权限,可以先建立,等待授权后再使用。

  Create view invalid_view as

  Select * from table_not_exist;

  Create force view invalid_view as

  Select * from table_not_exist;

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

  类似于company_phone_book是可以跟新的。

  可以通过dba_updatable_columns查看那些列可以做那些更新;

  desc hr.company_phone_book

  select * from dba_updatable_columns where table_name=upper(‘company_phone_book’)

  尝试更新email和name

  update hr.company_phone_book

  set name=’Chen, Donny’

  where emp_id=100

  1. 使用instead of 触发器更新视图:

  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;

  2. With check option 约束:

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

  试验:

  1) 建立视图,只能看到department_id=10的雇员

  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) 查看可更新列:

  select * from dba_updatable_columns

  where table_name=upper(‘department_10’)

  4) 尝试将此人移动到部门20

  update department_10

  set department_id=20

  where employee_id=200

  报错!!

  这个视图限制我们只能访问department=10的数据,我们要通过视图修改department=20的数据,被禁止。

  [试验]关于前5名

  1) 谁是公司前5名的雇员

  select last_name,hire_date

  from hr.employees

  order by hire_date;

  2) 只想取回前五名数据呢?

  select last_name,hire_date

  from hr.employees

  where rownum<6

  order by hire_date;

  结果不正确,先取了前5条数据,再排序

  3)select last_name,hire_date

  from (select last_name,hire_date

  from hr.employees

  order by hire_date)

  where rownum<6

0
相关文章