隨筆-14  評論-0  文章-6  trackbacks-0
          Oracle SYNONYM

          同義詞 synonym

          CREATE [PUBLIC]SYNONYM synonym For schema.object

          隱藏對象的名稱和所有者:
          select count(*) from hr.employees;
          create synonym emp for hr.employees;    --默認屬于donny用戶,是donny的私有對象private
          select count(*) from emp;

          為分布式數據庫的遠程對象提供了位置透明性:
          訪問其他數據庫時,要首先建立數據庫連結:
          CREATE DATABASE LINK test_link CONNECT TO username IDENTIFIED BY pass USING 'orabase';
          Select count(*) from hr.employees@test_link;
          create synonym link_emp for hr.employees@test_link;
          select count(*) from link_emp;

          提供對象的公共訪問:
          create public synonym pub_emp for hr.employees;
          pub_emp屬于public用戶,數據庫所有用戶都可以訪問。

          同義詞類型
          –私有 emp    實際上donny.emp
          –公用 pub_emp   所有用戶都可以直接訪問

          當公有對象和私有對象同名時(因為數據不同的用戶,所以可以),以私有對象優先。(類似于局部變量)
          desc   dba_synonyms/ user_synonyms/ all_synonyms 數據字典,復數
          tab公有同義詞
          建立私有的tab表,查看效果。

          刪除同義詞:
          drop synonym donny.emp;
          drop public synonym pub_emp;

           

           

           


          序列sequence:
          CREATE SEQUENCE donny.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, 當前值,已經被取得的值。

          Select seq.nextval from dual;
          Select seq.currval from dual;

          使用序列:
          insert into t values(seq.nextval);

          修改序列:
          alter sequence seq …..重新指定各個參數
          不能修改start with;除非刪除重建

          刪除序列:
          drop sequence seq;

          數據字典:
          desc dba_sequences / user_…/ all….


          視圖view:
          CREATE [OR REPLACE][FORCE/ NOFORCE] VIEW <view_name> AS <query>

          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
          Create view company_phone_book as
          Select first_name||’, ’||last_name name, email, phone_number
          From employees;

          Grant select on company_phone_book to public;

          Desc company_phone_book   對比列的長度

          Select * from company_phone_book;

          name隱藏數據的復雜性

          數據字典:
          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

          posted on 2008-01-23 10:14 高遠 閱讀(1945) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 岑巩县| 云林县| 洛浦县| 湖北省| 通城县| 武邑县| 桂平市| 高邑县| 静海县| 怀远县| 胶南市| 三门峡市| 宁明县| 廉江市| 巴中市| 阳原县| 哈密市| 峨眉山市| 麦盖提县| 贞丰县| 上饶县| 游戏| 措美县| 邓州市| 天峻县| 桓台县| 南郑县| 醴陵市| 巨鹿县| 邓州市| 青铜峡市| 昌乐县| 施甸县| 行唐县| 那坡县| 梁河县| 富平县| 澜沧| 巴楚县| 达尔| 北京市|