亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Oracle數據操作和控制語言詳解

瀏覽:2日期:2023-11-17 11:59:59
SQL語言共分為四大類:數據查詢語言DQL,數據操縱語言DML, 數據定義語言DDL,數據控制語言DCL。其中用于定義數據的結構,比如 創建、修改或者刪除數據庫;DCL用于定義數據庫用戶的權限;在這篇文章中我將具體講述這兩種語言在Oracle中的使用方法。 DML語言DML是SQL的一個子集,主要用于修改數據,下表列出了ORACLE支持的DML語句。語句 用途INSERT向表中添加行UPDATE更新存儲在表中的數據DELETE 刪除行SELECT FOR UPDATE 禁止其他用戶訪問DML語句正在處理的行。LOCK TABLE 禁止其他用戶在表中使用DML語句插入數據INSERT語句經常用于向表中插入行,行中可以有非凡數據字段,或者可以用子查詢從已存在的數據中建立新行。列目錄是可選的,缺省的列的目錄是所有的列名,包括comlumn_id,comlumn_id可以在數據字典視圖ALL_TAB_COLUMNS,USER_TAB_COLUMNS,或者DBA_TAB_COLUMNS中找到。插入行的數據的數量和數據類型必須和列的數量和數據類型相匹配。不符合列定義的數據類型將對插入值實行隱式數據轉換。NULL字符串將一個NULL值插入適當的列中。要害字NULL經常用于表示將某列定義為NULL值。下面的兩個例子是等價的。INSERT INTO customers(cust_id,state,post_code)VALUE('Ariel',NULL,'94501'); 或INSERT INTO customers(cust_id,state,post_code)VALUE('Ariel',,'94501');更新數據UPDATE命令用于修改表中的數據。UPDATE order_rollupSET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL'WHERE cust_id='KOHL'AND order_period=TO_DATE('01-Oct-2000')刪除數據DELETE語句用來從表中刪除一行或多行數據,該命令包含兩個語句: 1、要害字DELETE FROM后跟預備從中刪除數據的表名。 2、WHERE后跟刪除條件DELETE FROM po_linesWHERE ship_to_state IN ('TX','NY','IL')AND order_date 清空表假如你想刪除表中所有數據,清空表,可以考慮使用DDL語言的TRUNCATE語句。TRUNCATE就像沒有WHERE子句的DELETE命令一樣。TRUNCATE將刪除表中所有行。TRUNCATE不是DML語句是DDL語句,他和DELETE右不同的特點。TRUNCATE TABLE (schema)table DROP(REUSE) STORAGE STORAGE子串是可選的,缺省是DROP STORAGE。當使用DROP STORAGE時將縮短表和表索引,將表收縮到最小范圍,并重新設置NEXT參數。REUSE STORAGE不會縮短表或者調整NEXT參數。TRUNCATE和DELETE有以下幾點區別1、TRUNCATE在各種表上無論是大的還是小的都非常快。假如有ROLLBACK命令DELETE將被撤銷,而TRUNCATE則不會被撤銷。2、TRUNCATE是一個DDL語言,向其他所有的DDL語言一樣,他將被隱式提交,不能對TRUNCATE使用ROLLBACK命令。3、TRUNCATE將重新設置高水平線和所有的索引。在對整個表和索引進行完全瀏覽時,經過TRUNCATE操作后的表比DELETE操作后的表要快得多。4、TRUNCATE不能觸發任何DELETE觸發器。5、不能授予任何人清空他人的表的權限。6、當表被清空后表和表的索引講重新設置成初始大小,而delete則不能。7、不能清空父表。SELECT FOR UPDATEselect for update語句用于鎖定行,阻止其他用戶在該行上修改數據。當該行被鎖定后其他用戶可以用SELECT語句查詢該行的數據,但不能修改或鎖定該行。鎖定表LOCK語句經常用于鎖定整個表。當表被鎖定后,大多數DML語言不能在該表上使用。LOCK語法如下:LOCK schema table IN lock_mode其中lock_mode有兩個選項: share 共享方式 exclusive 唯一方式例:LOCK TABLE intentory IN EXCLUSIVE MODE死鎖當兩個事務都被鎖定,并且互相都在等待另一個被解鎖,這種情況稱為死鎖。 當出現死鎖時,ORACLE將檢測死鎖條件,并返回一個異常。事務控制事務控制包括協調對相同數據的多個同步的訪問。當一個用戶改變了另一個用戶正在使用的數據時,oracle使用事務控制誰可以操作數據。事務事務表示工作的一個基本單元,是一系列作為一個單元被成功或不成功操作的SQL語句。在SQL和PL/SQL中有很多語句讓程序員控制事務。程序員可以: 1、顯式開始一個事物,選擇語句級一致性或事務級一致性 2、設置撤銷回滾點,并回滾到回滾點  3、完成事務永遠改變數據或者放棄修改。事務控制語句語句用途Commit 完成事務,數據修改成功并對其他用戶開放Rollback 撤銷事務,撤銷所有操作rollback to savepoint 撤銷在設置的回滾點以后的操作set transaction響應事務或語句的一致性;非凡對于事務使用回滾段例:BEGINUPDATE checkingSET balance=balance-5000WHERE account='Kieesha';INSERT INTO checking_log(action_date,action,amount)VALUES (SYSDATE,'Transfer to brokerage',-5000);UPDATE brokerageSET cash_balance=cash_balance+5000WHERE account='Kiesha';INSERT INTO brokerage_log(action_date,action,amount)VALUES (SYSDATE,'Tracfer from checking',5000)COMMITEXCEPTIONWHEN OTHERSROLLBACKENDSavepoint 和 部分回滾(Partial Rollback)在SQL和PL/SQL中Savepoint是在一事務范圍內的中間標志。經常用于將一個長的事務劃分為小的部分。保留點Savepoint可標志長事務中的任何點,答應可回滾該點之后的操作。在應用程序中經常使用Savepoint;例如一過程包含幾個函數,在每個函數前可建立一個保留點,假如函數失敗,很輕易返回到每一個函數開始的情況。在回滾到一個Savepoint之后,該Savepoint之后所獲得的數據封鎖被釋放。為了實現部分回滾可以用帶TO Savepoint子句的ROLLBACK語句將事務回滾到指定的位置。例BEGIN INSERT INTO ATM_LOG(who,when,what,where)VALUES ('Kiesha',SYSDATE,'Withdrawal of $100','ATM54')SAVEPOINT ATM_LOGGED;UPDATE checkingSET balance=balance-100RETURN balance INTO new_balance;IF new_balance<0THENROLLBACK TO ATM_LOGGED;COMMITRAISE insufficient_funda;END IFEND 要害字SAVEPOINT是可選的,所以下面兩個語句是等價的:ROLLBACK TO ATM_LOGGED;ROLLBACK TO SAVEPOINT ATM_LOGGED;一致性和事務一致性是事物控制的要害慨念。把握了oracle 的一致性模型,能使您更好的,更恰當的使用事務控制。oracle通過一致性保證數據只有在事務全部完成后才能被用戶看見和使用。這項技術對多用戶數據庫有巨大的作用。oracle經常使用語句級(state-level)一致性,保證數據在語句的生命期之間是可見的但不能被改變。事務由多個語句組成,當使用事務時,事物級(transaction-level)一致性在整個事務生命期中保證數據對所有語句都是可見的。oracle通過SCN(syatem change number)實施一致性。一個SCN是一個面向時間的數據庫內部鍵。SCN只會增加不會減少,SCN表示了時間上的一個點,每個數據塊都有一個SCN,通過比較這個點實施操作。事務級一致性SET TRANSACTION 的一個作用是確保事務級一致或語句級一致中有一個實施。ORACLE使用這些術語: ISOLATION LEVEL READ COMMIT 表示語句級一致 ISOLATION LEVEL SERIALIZABLE 表示事務級一致。例:SET TRANSACTION ISOLATION LEVEL READ COMMIT;SET TRANSACTION ISOLATION LEVEL READ COMMIT下面的語句也能確保事務級一致:SET TRANSCATION READ ONLY任何企圖在只讀(READ ONLY)事務中修改數據的操作都會拋出一個異常。但是,READ ONLY事務只能在下列語句中使用:SELECT(沒有FOR UPDATE子句)LOCK TABLESET ROLEALTER SYSTEMALTER ALARM即使沒有改變任何數據,READ ONLY事務依然必須使用一個COMMIT或ROLLBACK以結束整個事務。 SET TRANSCTION的另外一個應用是在回滾時直接使用回滾段(ROLLBACK SEGMENT)。回滾段是ORACLE的一個非凡的數據對象,回滾段的頭部包含正在使用該回滾段事務的信息。當用戶回滾事務(ROLLBACK)時,ORACLE將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。oracle用round-robin給事務隨機分配回滾段。一個大的事務可以分配任何回滾段,這也許會導致回滾段的大小變得很大。因此要避免讓大的事務隨機分配回滾段。事務以SET TRANSACTION開始,象下面這樣:SET TRANSACTION USE ROLLBACK SEGMENT rb_large;rb_large是一個大的回滾段的名稱,現在就給一個大的事務分配了一個大的回滾段,其他的小的回滾段將不由動態空間治理,這樣就更有效率。下面我們看一個例子.我們有一個回滾段表空間大小是2G,在高峰時期需要10個回滾段以滿足用戶的需要,這些高峰在線用戶只有小的事務。一周我們連續運行了4個大的事務,這些事務需要刪除和加載數據,每一個撤銷需要1G,回滾段的大小如下:rb_large(initial 100M minextenta 2)rb1 (initial 1M next minextents 5) rb2 (initial 1M next minextents 5)rb3 (initial 1M next minextents 5)rb4 (initial 1M next minextents 5)rb5 (initial 1M next minextents 5)rb6 (initial 1M next minextents 5)rb7 (initial 1M next minextents 5)rb8 (initial 1M next minextents 5)rb9 (initial 1M next minextents 5)rb10 (initial 1M next minextents 5) 所有的都非常恰當的安排在2G的表空間中,假如我們缺省的round-robin給事務分配回滾段,4個大事務將有4個獨立的回滾段,每個回滾段的大小將是1G,假如這樣我們的2G表空間就不夠,而數據庫治理員就不得不在夜晚2點起來工作,每個事務都由以下面的語句開始:SET TRANSACTION USE ROLLBACK SEGMENT rb_large 現在 4個事務重用相同的表空間,保正4個回滾段的表空間在2G以內。數據庫治理員可以睡到天亮。建立和修改用戶CREATE USER 語句將建立一個用戶。當一個用戶連接到ORACLE數據庫時,它必須被驗證。ORACLE中驗證有三種類型: Database external Global缺省是數據庫驗證,當用戶連接到數據庫時,oracle將檢測用戶是否是數據庫的合法用戶,并且要提供正確的passWord.external驗證,oracle將只檢測用戶是否是合法用戶,password已經被網絡或系統驗證了。global驗證也是只檢測是否是合法用戶,password由oraclesecurity server驗證。Database驗證用戶賬號數據庫驗證賬號是張好的缺省類型,也是最普通的類型。建立一個賬號是piyush,口令是welcome的賬號,只需執行下面的命令:CREATE USE piyush IDENTIFIED BY welcomepiyush可以通過下面的語句將口令改變為saraswatt:ALTER USER piyush IDENTIFIED BY saraswati;外部驗證用戶賬號用戶賬號進入數據庫時可以不提供口令,這種情況下代替數據庫識別口令的是客戶端操作系統。外部驗證賬號有時也叫OPS$賬號,當他們最初在oracle6開始介紹時,oracle賬號都有要害字前綴OPS$,這也就是為什么init.ora 參數os_authent_prefix是OPS$--默認特征與oracle6保持一致。os_authent_prefix定義的字符串必須被預處理為用于Oracle外部識別賬號的操作系統賬號名。創建操作系統用戶appl的語句是:CREATE USER ops$appl IDENTIFIED EATERNALLY但在通常情況下,os_authent_prefix將被設置為空,像下面這樣:CREATE USER appl IDENTIFIED EATERNALLY這樣效果是一樣的,要害字IDENTIFIED EXTERNALLY告訴ORACLE這是一個外部識別賬號。GLOBAL用戶賬號GLOBAL類型的用戶賬號數據庫不檢測口令,而是由X.509目錄服務器檢測口令。創建一個GLOBAL類型的用戶賬號的方法是:CREATE USER scott IDENTIFIED GLOBALLY AS 'CN=scott,OU=divisional,O=sybex,C=US'要害字IDENTIFIED GLOBALLY AS表示建立的是一個GLOBAL類型的用戶賬號.創建和更改用戶賬號CREATE USER 用于建立用戶賬號和給用戶賬號的屬性賦值。ALTER USER用于更改用戶賬號和屬性。 但CREATE USER語句必須包括用戶名和口令。有部分屬性能用CREATER USER和ALTER USER語句設置,下面對是這些的屬性具體描述:給用戶分配缺省表空間表空間(tablespace)是放置表、索引、叢等用戶對象的。假如在create user語句中沒有包含表空間,那么缺省的是系統表空間。CREATE USER piyush IDENTIFIED BY saraswatiDEFAULTE TABLESPACE user_data;ALTER USER manoj DEFAULTE TABLESPACE dev1_data;給用戶分配臨時表空間臨時表空間,顧名思義是臨時存放表、索引等用戶對象的臨時段。建立方法一樣CREATE USER piyush IDENTIFIED BY saraswatiTemporary TABLESPACE user_data;ALTER USER manoj Temporary TABLESPACE dev1_data;給用戶分配表空間的使用定額使用定額限制用戶在表空間中使用磁盤的數量。定額可以按字節、千字節、兆字節或者無限制來制定。CREATE USER piyush IDENTIFIED BY saraswatiDEFAULT TABLESPACE user_dataQUOTA UNLIMITED ON user_dataQUOTA 20M ON tools;ALTER USER manoj QUOTA 2500K ON tools;給用戶分配一個簡表簡表可以限制用戶在會話時消耗的資源。這些資源包括:連接數據庫的時間,空閑時間,每次會話的邏輯讀數據的數量等等,缺省的簡表對資源無限制。CREATE USER piyush IDENTIFIED BY saraswatiPROFILE TABLESPACE user_data;ALTER USER manoj Temporary TABLESPACE dev1_data;為用戶響應指定角色這個屬性只能由ALTER USER語句設置,試圖用CREATE USER語句設置將回返回一個例外。ALTER USER manoj DEFAULT ROLE ALL EXCEPT salary_adm;為用戶的password設定到期時間以便在用戶下次登錄時更改當用戶的password到期,在下一次登錄時將強迫修改password,oracle提示用戶輸入舊的password,然后輸入新的password。這項功能常用于新用戶,當新用戶用缺省的password登錄時必須修改立即修改password.ALTER USER manoj IDENTIFIED BY welcome;ALTER USER manoj PASSWORD EXPIRE;鎖定賬號,是用戶不能登錄ALTER USER ql AC COUNT LOCK 對賬號解鎖,以便用戶能登錄數據庫ALTER USER ql ACCOUNT UNLOCK權限和角色權限答應用戶訪問屬于其它用戶的對象或執行程序,ORACLE系統提供三種權限: Object 對象級 System 系統級 Role 角色級這些權限可以授予給用戶、非凡用戶public或角色,假如授予一個權限給非凡用戶'Public'(用戶public是oracle預定義的,每個用戶享有這個用戶享有的權限),那么就意味作將該權限授予了該數據庫的所有用戶。對治理權限而言,角色是一個工具,權限能夠被授予給一個角色,角色也能被授予給另一個角色或用戶。用戶可以通過角色繼續權限,除了治理權限外角色服務沒有其它目的。權限可以被授予,也可以用同樣的方式撤銷。建立和使用角色如前所訴,角色存在的目的就是為了使權限的治理變得輕松。建立角色使用CREATE ROLE語句,他的語法如下:CREATE ROLE role_name IDENTIFIED BY passwordCREATE ROLE role_name IDENTIFIED EXTERNALLYCREATE ROLE role_name IDENTIFIED GLOBALLY缺省情況下建立的角色沒有password或者其他的識別。假如使用IDENTIFIED BY 子句建立,那么角色不會自動響應,必須用SET ROLE激活。SET ROLE role_name IDENTIFIED BY passwordEXTERNALLY和GLOBALLY類型的角色由操作系統和ORACLE Service server驗證。通常用戶需要權限修改應用程序中使用的表單中的數據,但是只有在應用程序運行時而不是在使用ad hoc工具時,這種上下文敏感安全可以通過有PASSWORD的角色來實現。當用戶在應用程序內部連結數據庫時,代碼將執行SET ROLE命令,通過安全驗證。所以用戶不需要知道角色的password,也不需要自己輸入SET ROLE命令。對象權限對象權限就是指在表、視圖、序列、過程、函數或包等對象上執行非凡動作的權利。有九種不同類型的權限可以授予給用戶或角色。如下表:權限ALTERDELETEEXECUTEINDEXINSERTREAD REFERENCESELECT UPDATEDirectoryno no no no no yesnono nofunctionnonoyesno nononononoprocedureno noyesnonono nononopackagenonoyesnonononononoDB Objectno no yesnono nonononoLibary nonoyes nonono no nonoOperation no no yesno no no no no noSequenceyes no no no no no no no noTable yes yes noyesyes no yes yes yesTypeno no yes no no no no no noView no yes no no yes no no yes yes對象由不止一個權限,非凡權限ALL可以被授予或撤銷。 如TABLE的ALL權限就包括: SELECT,INSERT,UPDATE和DELETE,還有INDEX,ALTER,和REFERENCE。如何看這個表我們以ALTER權限為例進行說明ALTER權限答應執行ALTER TABLE和LOCK TABLE操作,ALTER TABLE可以進行如下操作:. 更改表名. 增加或刪除列. 改變列的數據類型或大小. 將表轉變為分區表在SEQUENCE上的ALTER權限答應執行ALTER Sequence語句,重新給sequence分配最小值、增量和緩沖區大小。系統權限系統權限需要授予者有進行系統級活動的能力,如連接數據庫,更改用戶會話、建立表或建立用戶等等。你可以在數據字典視圖SYSTEM_PRIVILEGE_MAP上獲得完整的系統權限。對象權限和系統權限都通過GRANT語句授予用戶或角色。需要注重的是在授予對象權限時語句應該是WITH GRANT OPTION子句,但在授予系統權象時語句是WITH ADMIN OPTION,所以在你試圖授予系統權限時,使用語句WITH GRANT OPTION系統會報告一個錯誤:ONLY ADMIN OPTION can be specified。在考試中要非凡注重這個語法和錯誤信息。角色和角色權限角色權限就是將屬于用戶的權限授予一個角色。任何權限都可以授予給一個角色。授予系統權限給被授予者必須使用WITH_ADMIN_OPTION子句,在會話期間通過SET ROLE語句授予或撤銷角色權限。然而,角色權限不能依靠存儲在SQL中的權限。假如函數、程序、包、觸發器或者方法使用另一個計劃擁有的對象,那么就必須直接給對象的擁有者授權,這是因為權限不會在會話之間改變。授予和撤銷權限 給用戶或者角色授予權限使用GRANT 語句,GRANT語句的語法如下:GRANT ROLE(或system privilege) TO user(role,Public) WITH ADMIN OPTION(可選)對象權限被授予 WITH GRANT OPTION,權限和數據字典數據字典是ORACLE存儲有關數據庫結構信息的地方,數據本身存放在其他地方,數據字典由表和視圖組成。在考試中關于數據字典最輕易考的內容是:查看那一類權限已經被授予。比如DBA_TAB_PRIV包含了用戶授予給另一用戶的對象權限和在授予時是否帶有WITH GRANT OTPION子串的信息。注重DBA_TAB_PRIV不僅僅包含了對表的權限的關系,他還包括函數、包、隊列等等上的權限的關系。下表列出了所有的權限和角色的數據字典視圖:表: 權限的數據字典視圖視圖 作用ALL_COL_PRIVS表示列上的授權,用戶和PUBLIC是被授予者ALL_COL_PRIVS_MADE 表示列上的授權,用戶是屬主和被授予者ALL_COL_RECD表示列上的授權,用戶和PUBLIC是被授予者ALL_TAB_PRIVS表示對象上的授權,用戶是PUBLIC或被授予者或用戶是屬主ALL_TAB_PRIVS_MADE 表示對象上的權限,用戶是屬主或授予者ALL_TAB_PRIVS_RECD 表示對象上的權限, 用戶是PUBLIC或被授予者DBA_COL_PRIVS 數據庫列上的所有授權DBA_ROLE_PRIVS 顯示已授予用戶或其他角色的角色DBA_SYS_PRIVS 已授予用戶或角色的系統權限DBA_TAB_PRIVS 數據庫對象上的所有權限ROLE_ROLE_PRIVS 顯示已授予用戶的角色ROLE_SYS_PRIVS顯示通過角色授予用戶的系統權限ROLE_TAB_PRIVS顯示通過角色授予用戶的對象權限SESSION_PRIVS 顯示用戶現在可利用的所有系統權限USER_COL_PRIVS顯示列上的權限,用戶是屬主、授予者或被授予者USER_COL_PRIVS_MADE顯示列上已授予的權限,用戶是屬主或授予者USER_COL_PRIVS_RECD 顯示列上已授予的權限,用戶是屬主或被授予者USER_ROLE_PRIVS 顯示已授予給用戶的所有角色USER_SYS_PRIVS 顯示已授予給用戶的所有系統權限USER_TAB_PRIVS顯示已授予給用戶的所有對象權限USER_TAB_PRIVS_MADE 顯示已授予給其他用戶的對象權限,用戶是屬主USER_TAB_PRIVS_RECD顯示已授予給其他用戶的對象權限,用戶是被授予者
標簽: Oracle 數據庫
相關文章:
主站蜘蛛池模板: a级黄色毛片三 | 欧美成人手机视频 | 国产精品一区二区三区四区五区 | 朴妮唛19禁福利视频在线 | 日本的黄色录像 | 麻豆igao在线视频 | 亚洲精品香蕉一区二区在线观看 | 国产亚洲欧美日韩在线一区 | 亚洲第五色综合网啪啪 | 亚洲欧美国产精品第1页 | 521色香蕉网在线观看免费 | 国产成人污污网站在线观看 | 国产高清精品入口麻豆 | 啪一啪在线 | www.啪| 精品久久久久久国产91 | 久久亚洲精品中文字幕第一区 | 国产理论视频在线观看 | 婷婷午夜 | 精品成人免费一区二区在线播放 | 欧美成人看片黄a免费看 | 91精品麻豆| 毛片在线视频在线播放 | 亚洲精品aⅴ中文字幕乱码 亚洲精品aaa | 黄色大片一级 | 亚洲色图婷婷 | 涩涩国产精品福利在线观看 | 日韩一区二区在线播放 | 成年人免费网站视频 | 欧美精品亚洲精品日韩1818 | 鸥美肥妇特级毛片视频 | 久热这里只有精品视频6 | 天天色综合图片 | 老人与老人免费a级毛片 | 日本午夜一级特黄毛片 | 国产高清好大好夹受不了了 | 国产成人盗拍精品免费视频 | a级午夜毛片免费一区二区 a级午夜理论免费毛片 | 日韩图区| 欧美日韩第二页 | 一区在线免费观看 |