1. 程式人生 > >oracle基礎教程(第五天)管理索引、許可權和角色

oracle基礎教程(第五天)管理索引、許可權和角色

期望目標 1.掌握維護oracle資料完整性的技巧 2.理解索引概念,會建立索引 3.管理oracle的許可權和角色 維護資料的完整性 資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則。在oracle中,資料完整性可以使用約束、觸發器、應用程式(過程、函式)三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。 約束 約束用於確保資料庫資料滿足特定的商業規則。在oracle中,約束包括:not null、unique(唯一)、primary key、foreign key和check(檢查)五種。 not null(非空) 如果在列上定義了not null,那麼當插入資料時,必須為列提供資料。 unique(唯一)
當定義了唯一約束後,該列值是不能重複的,但是可以為null。 primary key(主鍵) 用於唯一的標示錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為null。 需要說明的是:一張表最多隻能有一個主鍵,但是可以有多個unqiue約束。 foreign key(外來鍵) 用於定義主表和從表之間的關係。外來鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique約束,當定義外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或是為null。 check 用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000~2000之間,如果不在1000~2000之間就會提示出錯。 商店售貨系統表設計案例---建立

SQL>create table scott.goods (--商品表     goodsId char(8) primary key,--主鍵        goodsName varchar2(30),        unitprice number(10,2) check (unitprice > 0),        category varchar2(8),        provider varchar2(30) ); SQL>create table customer (--客戶表     customerId char(8) primary key,--主鍵     name varchar2(50) not null,--不為空     address varchar2(50),     email varchar2(50) unique,     sex char(2) default '男' check (sex in ('男','女')),     cardId char(18) ); SQL>
create table purchase (--購買表     customerId char(8) references customer (customerId),     goodsId char(8) references goods (goodsId),     nums number(5) check (nums between 1 and 30) ); 商店售貨系統表設計案例(2)---維護
增加商品名不能為空 SQL>alter table goods modify goodsName not null; 增加身份證不能重複 SQL>alter table customer add constraint cardunique unique(cardId); 增加客戶的住址限制  SQL>alter table customer add constraint addresscheck check (address in ('東城','西城')); 刪除約束 當不在需要某個約束時,可以刪除。 SQL>alter table 表名 drop constraint 約束名稱; 特別說明: 在刪除主鍵約束的時候,可能有錯誤,比如: SQL>alter table 表名 drop primary key; 這是因為如果兩張表存在主從關係,那麼在刪除主表的主鍵約束時,必須帶上cascade選項,如下: SQL>alter table 表名 drop primary key cascade; 顯示約束資訊 1.顯示約束資訊 通過查詢資料字典檢視user_constraints,可以顯示當前使用者所有的約束的資訊。 SQL>select constraint_name,constraint_type,status,validated from user_constraints where table_name = '表名'; 2.顯示約束列 通過查詢資料字典檢視user_cons_cloumns,可以顯示約束所對應的表列資訊。 SQL>select column_name,position from user_cons_cloumns where constraint_name='約束名'; 3.當然也有更容易的方法,直接用pl/sql developer檢視即可。 表級定義和列級定義 列級定義 列級定義是在定義列的同時定義約束 如在department表定義主鍵約束 SQL>create table department4( dept_id number(2) constraint pk_department primary key, name varchar2(12), loc varchar2(12) ); 表級定義 表級定義是指在定義了所有列後,再定義約束。這裡需要注意的是not null約束只能在列級上定義。 以在建立employee2表時定義主鍵約束和外來鍵約束為例: SQL>create table employee2( emp_id number(4),name varchar2(15),dept_id number(2), constraint pk_employee primary key (emp_id), constraint fk_department foreign_key (dept_id) references department4(dept_id)); 管理索引   ---    原理介紹 索引是用於加速資料存取的資料物件。合理的使用索引可以大大降低i/o次數,從而提高資料訪問效能。索引有很多種,我們主要介紹常用的幾種: 為什麼添加了索引後,會加快查詢速度呢? 管理索引---建立索引 單列索引 單列索引是基於單個列所建立的索引,比如: create index 索引名 on 表名(列名) 複合索引 複合索引是基於兩列或是多列的索引。在同一張表上可以有多個索引,但是要求列的組合必須不同,比如: create index emp_idx1 on emp (ename,job); create index emp_idx2 on emp (job,name); 使用原則 (1)在大表上建立索引才有意義 (2)在where子句或是連線條件上經常引用的列上建立索引 (3)索引的層次不要超過4層 索引缺點分析 索引有一些先天不足: 1.建立索引,系統要佔用大約為表的1.2倍的硬碟和記憶體空間來儲存索引。 2.更新資料的時候,系統必須要有額外的時間來同時對索引進行更新,以維持資料和索引的一致性。 實踐證明,不恰當的索引不但於事無補,反而會降低系統性能。因為大量的索引在進行插入、修改和刪除時比沒有索引花費更多的時間。 比如在如下欄位建立索引應該是不恰當的: 1.很少或從不引用的欄位 2.邏輯型的欄位,如男或女(是或否)等。綜上所述,提高查詢效率是以消耗一定的系統資源為代價的,索引不能盲目的建立,這是考驗一個DBA是否優秀的很重要的指標。  其他索引 按照資料儲存方式,可以分為B*樹、反向索引、點陣圖索引; 按照索引列的個數分類,可以分為單列索引、複合索引; 按照索引列值的唯一性,可以分為唯一索引和非唯一索引。 此外還有函式索引,全域性索引,分割槽索引... 對於索引來說,在不同的情況我們會在不同的列上建立索引,甚至建立不同種類的索引,請記住,技術是死的,人是活的。比如: B*樹索引建立在重複值很少的列上,而點陣圖索引則建立在重複值很多、不通知相對固定的列上。 顯示索引資訊 顯示錶的所有索引 在同一張表可以有多個索引,通過查詢資料字典檢視dba_indexs和user_indexs,可以顯示索引資訊。其中dba_indexs用於顯示資料庫所有的索引資訊,而user_indexs用於顯示當前使用者的索引資訊: select index_name,index_type from user_indexs where table_name='表名'; 顯示索引列 通過查詢資料字典檢視user_ind_columns,可以顯示索引對應的列的資訊 select table_name,column_name from user_ind_columns where index_name='IND_ENAME'; 你也可以通過pl/sql developer工具檢視索引資訊。 掌管許可權和角色 這一部分我們主要看oracle中如何管理許可權和角色,許可權和角色的區別在哪裡。 當剛剛建立使用者時,使用者沒有任何許可權,也不能執行任何操作。如果要執行某種特定的資料庫操作,則必須為其授予系統的許可權;如果使用者要訪問其他方案的物件,則必須為其授予物件的許可權。為了簡化許可權的管理,可以使用角色。 許可權 許可權是指執行特定型別的sql命令或是訪問其他方案物件的權利,包括系統許可權和物件許可權兩種: 系統許可權介紹: 系統許可權是指執行特定型別sql命令的權利。它用於控制使用者可以執行的一個或是一組資料庫操作。比如當用戶具有create table許可權時,可以在其方案中建表,當用戶具有create any table許可權時,可以在任何方案中建表。oracle提供了100多種系統許可權。 常用的有; create session   連線資料庫            create table   建表 create view        建檢視                   create public synonym   建同義詞 create procedure   建過程、函式、包   create trigger   建觸發器 create cluster   建簇 顯示系統許可權 oracle提供了100多種系統許可權,而且oracle的版本越高,提供的系統許可權就越多,我們可以查詢資料字典檢視system_privilege_map,可以顯示所有系統許可權。 select * from system_privilege_map order by name; 授權系統許可權 一般情況,授予系統許可權是由dba完成的,如果用其它使用者來授予系統許可權,則要求該使用者必須具有grant any privilege的系統許可權在授予系統許可權時,可以帶有with admin option選項,這樣,被授予許可權的使用者或是角色還可以將該系統許可權授予其它的使用者或是角色。為了讓大家快速理解,我們舉例說明: 1.建立兩個使用者ken,tom。初始階段他們沒有任何許可權,如果登入就會給出錯誤的資訊。 create user ken identified by m123; 2.給使用者ken授權 ①grant create session,create table to ken with admin option; ②grant create view to ken; 3.給使用者tom授權 我們可以通過ken給tom授權,因為with admin option是加上的。當然也可以通過dba為tom授權,我們就用ken給tom授權: ①grant create session,create table to tom; ②grant create view to tom;  →ok嗎?【不ok】 回收系統許可權 一般情況下,回收系統許可權時dba來完成的,如果其他的使用者來回收系統許可權,要求該使用者必須具有相應系統許可權及轉授系統許可權的選項(with admin option)。回收系統許可權使用revoke來完成。 當回收了系統許可權後,使用者就不能執行相應的操作了,但是請注意,系統許可權級聯回收問題?【不是級聯回收】 system→ken→tom 用system執行如下操作: revoke create session from ken;請思考tom還能登入嗎?---可以登入 物件許可權介紹 指訪問其他方案物件的權利,使用者可以直接訪問自己的方案的物件,但是如果要訪問別的方案的物件,則必須具有其物件的許可權。 比如smith使用者要訪問scott.emp表(scott:方案,emp:表) 則必須在scott.emp表上具有物件的許可權。 常用的有: alter 修改       delete 刪除   select 查詢           insert 新增 update 修改   index 索引    references 引用   rxecute 執行 顯示物件許可權 通過資料字典檢視可以顯示使用者或是角色所具有的物件許可權。檢視為dba_tab_privs SQL>conn system/manager; SQL>select distinct privilege from dba_tab_privs; SQL>select grantor,owner,table_name,privilege from dba_tab_privs where grantee='BLAKE'; 授予物件許可權 在oracle9i前,授予物件許可權是由物件的所有者來完成的,如果用其它的使用者來操作,則需要使用者具有相應的(with grant option)許可權,從oracle9i開始,dba使用者(sys,system)可以將任何物件上的許可權授予其它使用者。授予物件許可權使用grant命令來完成的。 物件許可權可以授予使用者,角色,和public。在授予許可權時,如果帶有with grant option選項,則可以將該許可權轉授給其它使用者。但是要注意with admin option選項不能被授予角色。 1.monkey使用者要操作scott.emp表,則必須授予相應的物件許可權 ①希望monkey可以查詢scott.emp的表資料,怎樣操作? SQL>grant select on emp to monkey; ②希望monkey可以修改scott.emp的表資料,怎樣操作? SQL>grant update on emp to monkey;
③希望monkey可以刪除scott.emp的表資料,怎樣操作? SQL>grant delete on emp to monkey;
④有沒有更加簡單的方法,一次把所有許可權賦給monkey? SQL> grant all on emp to monkey; 2.能否對monkey訪問許可權更加精細控制(授予列許可權) ①希望monkey只可以修改scott.emp的表的sal欄位,怎樣操作? SQL>grant update on emp(sal) to monkey; ②希望monkey只可查詢scott.emp的表的ename,sal資料,怎樣操作? SQL>grant select on emp(ename,sal) to monkey; 3.授予alter許可權 如果black使用者要修改scott.emp表的結構,則必須授予alter物件許可權 SQL>conn scott/root123; SQL>grant alter on emp to black; 當然也可以用system,sys來完成這件事 4.授予execute許可權 如果使用者想要執行其他方案的包過程/函式,則需要有execute許可權。 比如為了讓ken可以執行包dbms_transaction,可以授予execute許可權。 SQL>conn system/manager; SQL>grant execute on dbms_transaction to ken; 5.授予index許可權 如果想在別的方案的表上建立索引,則必須具有index物件許可權,如為了讓black可以在scott.emp上建立索引,就給其index的物件許可權。 SQL>grant index on scott.emp to black; 6.使用with grant option選項 該選項用於轉授物件許可權,但是該選項只能被授予使用者,而不能授予角色 SQL>conn scott/root123; SQL>grant select on emp to black with grant option; SQL>conn black/m123; SQL>grant select on scott.emp to jones; 回收物件許可權 在oracle9i中,收回物件的許可權可以由物件的所有者來完成,也可以用dba使用者(sys,system)來完成 這裡要說明的是:收回物件許可權後,使用者就不能執行相應的sql命令,但是要注意的是物件的許可權是否會被級聯回收?【會級聯回收】 如:scott→black→jones(select on emp) SQL>conn scott/root123; SQL>revoke select on emp from black; 這時,jones使用者不能再查詢scott.emp表。 角色 角色就是相關許可權的命令集合,使用角色的主要目的就是為了簡化許可權的管理。假定有使用者a,b,c,為了讓他們都擁有許可權①連線資料庫②在scott.emp表上select,insert,update。如果採用直接授權操作,則需要進行12次授權。 我們如果採用角色就可以簡化: 首先將create session,select on scott.emp,insert on scott.emp,update on scott.emp授予角色,然後將該角色授予a,b,c使用者,這樣就可以三次授予搞定。 角色分為預定義和自定義角色兩類: 預定義角色 預定義角色時oracle所提供的角色,每種角色都用於執行一些特定的管理任務,下面我們介紹常用的預定義角色connect,resource,dba (一)connect角色 connect角色有一般應用開發人員需要的大部分許可權,當建立了一個使用者後,多數情況下,只要給使用者授予connect和resource角色就夠了,那麼connect角色具有哪些系統許可權呢? alter session  修改回話 create cluster  建立簇 create database link  修改資料庫連線 create session  連線資料庫 create table  建立表 create view  建立檢視 create sequence  建立序列 (二)resource角色 resource角色具有應用開發人員所需要的其他許可權,比如建立儲存過程、觸發器等。這裡需要注意的是resource角色隱含了unlimited tablespace(無限制表空間)系統許可權。 resource角色包含了以下系統許可權: create cluster  建立簇 create indextype  建立索引 create table  建立表 create sequence  建立序列 create type create procedure  建立過程 create trigger  建立觸發器 (三)dba角色 dba角色具有所有的系統許可權,及with admin option選項,預設的dba使用者為sys和system,他們可以將任何系統許可權授予其它使用者。但是要注意的是dba角色不具備sysdba和sysoper的特權(啟動和關閉資料庫)。 自定義角色 顧名思義就是自己定義的角色,根據自己的需要來定義。一般是由dba建立,如果用別的使用者來建立,則需要具有create role的系統許可權。在建立角色時可以指定驗證方式(不驗證,資料庫驗證等)。 (一)建立角色(不驗證) 如果角色是公用的角色,可以採用不驗證的方式建立角色 create role 角色名 not identified; (二)建立角色(資料庫驗證) 採用這樣的方式時,角色名、口令存放在資料庫中。當啟用該角色時,必須提供口令,在建立這種角色時,需要為其提供口令。 create role 角色名 identified by m123; 角色授權 當建立角色時,角色沒有任何許可權,為了使得角色完成特定任務,必須為其授予相應的系統許可權和物件許可權。 (一)給角色授權 給角色授予許可權和給使用者授予許可權沒有太大區別,但是要注意,系統許可權的unlimited tablespace和物件許可權的with  grant option選項是不能授予角色的。 SQL>conn system/manager; SQL>grant create session to 角色名 with admin option; SQL>conn scott/root123; SQL>grant select on emp to 角色名; SQL>grant insert,update on emp to 角色名; SQL>grant delete on emp to 角色名; (二)分配角色給某個使用者 一般分配角色是由dba來完成的。如果要以其他使用者身份分配角色,則要求使用者必須具有grant any role的系統許可權。 SQL>conn system/manager; SQL>grant 角色名 to 使用者名稱 with admin option; 因為我給了with admin option選項,所以,使用者可以把system分配給它的角色分配給別的使用者。 刪除角色 使用drop role,一般是dba來執行,如果用其它使用者則要求改使用者具有drop any role系統許可權。 SQL>conn system/manager; SQL>drop role 角色名; 顯示角色資訊 ①顯示所有角色 SQL>select * from dba_roles; ②顯示角色具有的系統許可權 SQL>select privilege,admin_option from role_sys_privs where role='角色名'; ③顯示角色具有的物件許可權 通過查詢資料字典檢視dba_tab_privs可以檢視角色擁有的物件許可權或是列的許可權。 ④顯示使用者具有的角色及預設角色 當以使用者的身份連線到資料庫時,oracle會自動的啟用預設的角色,通過查詢資料字典檢視dba_role_privs可以顯示某個使用者具有的所有角色以及當前預設的角色 SQL>select granted_role,default_role from dba_role_privs where grantee='使用者名稱'; 精細訪問控制 是指使用者可以使用函式、策略實現更加細微的安全訪問控制。如果使用精細訪問控制,則當在客戶端發出sql語句(select、insert、update、delete)等,oracle會自動在sql語句後追加謂詞(where子句),並執行新的sql語句。通過這樣的控制,可以使得不同的資料庫使用者在訪問相同表時,返回不同的資料資訊。

相關推薦

oracle基礎教程管理索引許可權角色

期望目標 1.掌握維護oracle資料完整性的技巧 2.理解索引概念,會建立索引 3.管理oracle的許可權和角色 維護資料的完整性 資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則。在oracle中,資料完整性可以使用約束、觸發器、應用程式(過程、函式)三種方法

python基礎

int 不可變 有序 clear tuple val ket def python3.6 1、數據類型: 1> 可變數據類型:list, dict -----> 不可哈希 2>不可變數據類型:int, str, bool,tuple---->可哈希

C# 窗體 切換重復顯示等遺留問題解決

event 學校 切換 ner 父窗體 所有 var smd 彈出 一、解決同一窗體多次點擊重復顯示BUG (1)點擊彈出學校窗體 1 #region 彈出學校窗體 2 /// <summary&g

Python基礎教程3版pdf

屬性 ria AS 設計 back sof 基礎教程 主題 splay 下載地址:網盤下載 本書包括Python程序設計的方方面面:首先從Python的安裝開始,隨後介紹了Python的基礎知識和基本概念,包括列表、元組、字符串、字典以及各種語句;然後循序漸進地介紹了一些相

分享《Python基礎教程3版高清中文版PDF+高清英文版PDF+源代碼

oss python 51cto 下載 baidu 中英文 ofo https water 下載:https://pan.baidu.com/s/112w57moG7UGLuLzKomYuAA 其他資料請見:http://blog.51cto.com/3215120 《Py

Python基礎教程3版高清中文版PDF+英文原版PDF+2版源代碼

jpg alt 經典 images python -o ESS pro 第2版 Python基礎教程(第3版)高清中文版PDF+英文原版PDF+2版源代碼以及Python基礎教程(第2版)中文版和英文原版,共4本書!Python入門學習的必備經典!資源鏈接:https://

分享《Python基礎教程3版》+PDF+源碼+Magnus Lie Hetland+袁國忠

ges 講解 中文 .com img 下載 ado href 學習 下載:https://pan.baidu.com/s/1ThV7fnGEEFGjihfEOkRkOg 轉自:http://blog.51cto.com/14087171 《Python基礎教程(第3版)》(

STC15程式設計之矩陣尋跡

言之者無罪,聞之者足以戒。 - “詩序” 其實前兩天我就以為自己的矩陣已經調好了,我得出這個結論並不是編造的,而是它已經能夠完成尋跡了,只是有些不完美,就是總會有些搖頭晃腦,我自己本身也是想調的更好一些,所以我就仔細的檢查了自己的程式碼,認真的過一遍邏輯,又用Debug除錯了一遍,發現還是有些錯

python 基礎教程三版學習筆記

第十四章 網路程式設計 鑑於Python提供的網路工具眾多,這裡只能簡要地介紹它的網路功能。 本章首先概述Python標準庫中的一些網路模組。然後討論SocketServer和相關的類,並介紹 地介紹同時處理多個連線的各種方法。最後,簡單地說一說Twisted

《Python程式設計從入門到實踐》+《流暢的Python》+《Python基礎教程3版》分析對比

《Python程式設計從入門到實踐》針對所有層次的Python 讀者而作的Python 入門書。全書分兩部分:第一部分介紹用Python 程式設計所必須瞭解的基本概念,包括matplotlib、NumPy 和Pygal 等強大的Python 庫和工具介紹,以及列表、字典、if 語句、類、檔案與異常、程式碼測試

《Python編程從入門到實踐》+《流暢的Python》+《Python基礎教程3版》分析對比

問題 定制 講解 幫助 web 應用 交互式 並行 字典 易維 《Python編程從入門到實踐》針對所有層次的Python 讀者而作的Python 入門書。全書分兩部分:第一部分介紹用Python 編程所必須了解的基本概念,包括matplotlib、NumPy 和Pygal

《Python基礎教程三版》閱讀筆記暨Python3入門基礎教程

第一章、快速上手:基礎知識 ''' 第一章:基礎知識 1、python無需加分號,加了也無所謂 2、Python / 除法的結果為浮點數,如果想要整除則要使用//,整除會向下取整,也就是: 10//-3 ==-4 3、Python3中,所有的字串都是Unicode

D3.js的v5版本入門教程—— 選擇插入刪除元素

D3.js的v5版本入門教程(第五章)     1、選擇元素     現在我們已經知道,d3.js中選擇元素的函式有select()和selectAll(),下面來詳細講解一下     假設我們的<body>中有三個<p>,如下     <

LeetCode刷題記錄

Trapping Rain Water原題目:Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much wate

Python基礎教程3版中文版 7章 類物件筆記

                                  7 類和物件 1.物件魔法  1.多型  2.多型和方法   3.封裝  4.繼承 2.類  1.類是什麼 類 型別 2.建立自定義類  class Person:      def set_

oracle基礎教程第二

一、oracle表的管理 表名和列的命名規範 1.必須以字母開頭 2.長度不能超過30字元 3.不能使用oracle的保留字(關鍵字) 4.只能使用如下字元 A-Z,a-z,0-9,$,#等 oracle支援的資料型別 1.字元型     char    定長  最大2

spark基礎知識學習適合新手學習

Shark Hive sql -> mrShark sql ->Spark coreSpark2.0之前的版本的Spark-SQL並不支援開窗函式和子查詢的1.Spark SQL1.6.x特點:(1).記憶體列儲存(不是按照物件儲存的),面向列的儲存方式(減少對記憶體的消耗)(2).位元組碼生成技

oracle基礎教程第一

一、做專案該用什麼資料庫要考慮哪些方面? 1.專案的規模 2.負載量多大,使用者多大 3.成本 4.安全性 小型資料庫(access、foxbase) 1.負載量小,使用者量在1000人以內,比如留言板,小型資訊系統 2.成本在千元左右 3.對安全性要求不高 中型資料庫

AndroidListFragment與ViewPager

viewgroup cat () wid group 得到 ica bottom csdn 1ListFragment 今天首先學習了一種很經常使用的展示場景:列表展示。 昨天學習了使用Fragmet來取代activity進行設計。今天在托管單

python基礎教程三版)學習筆記

第六章 抽象(函式) 6.1 懶惰是一種美德 6.2 抽象和結構 6.3 自定義函式 判斷某個物件是否可呼叫,可使用內建函式callable。格式是callable(物件)。 函式是結構化程式設計的核心。使用def(表示定義函式)語句。 '''   def fun(str_s): #