oracle 數據庫入門。
1、數據
2、數據存儲的地方:變量 數組 容器 (內存中),文件,數據庫(文件)
3、數據庫系統:sqlserver 2000 2005 2008 mysql 5.5 oracle 9i 10g 11g db2
4、oracle 數據
5、oracle 數據庫不同於其他的數據庫,一個數據庫下面有好多用戶:
用戶模式:sys system scott 默認用戶
老師這里認為 實例等價於數據庫、用戶等價於模式、表空間
在oracle 里面 一個 實例 就對應一個 數據庫。 用戶 等價於 開啟一種特定對應的模式,比如普通權限的用戶或者 超級管理員 等等等。
好吧 還是 看那個 ppt 吧,實例指的是:數據庫服務器的內存與相關處理程序。
吼吼吼!這個 ORACLE SQL*Plus 是默認自帶安裝的。
當 當前表中沒有數據的時候,返回的結果是:
如果是使用PL/SQL Developer 的話,返回的結果是:
Sys權限最高是超級用戶。具有最高權限。擁有sysdba角色。特色在於擁有create database也就是創建數據庫的權限。
System是用戶管理員。具有很大的權限,沒有創建創建數據庫的權限,除此之外權限相同。
其他的今本上都是普通用戶了。
1、連接 conn 語法:
SQL> conn system/lifei23
已連接。
SQL> conn sys/lifei23
ERROR:
ORA-28009: connection as SYS should be as SYSDBA or SYSOPER
警告: 您不再連接到 ORACLE。
SQL> show user;
USER 為 ""
SQL>
一旦用戶名密碼輸入錯誤,則與oracle的連接斷開,所以此時不再能連接到數據庫,再次展示用戶,用戶為空。
可見每次執行 conn 命令時,是先退出當前用戶,隨即登錄最新的用戶,如果用戶名密碼正確允許登錄,如果錯誤則失去連接(因為之前登錄用戶已經退出)。
SQL> conn system/lifei23
已連接。
SQL> conn sys/lifei23
ERROR:
ORA-28009: connection as SYS should be as SYSDBA or SYSOPER
警告: 您不再連接到 ORACLE。
SQL> show user;
USER 為 ""
SQL> conn lifei/lifei
ERROR:
ORA-01017: invalid username/password; logon denied
警告: 您不再連接到 ORACLE。
可是兩種登錄失敗,是有本質上差距的。不知道 那個 系統用戶如何才能登錄成功,至少現在不知道。
警告: 您不再連接到 ORACLE。
2、disc命令
SQL> disc
SQL> show user;
USER 為 ""
SQL> conn scott/lifei23;
已連接。
SQL> disc
從 Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options 斷開
SQL>
登錄當前用戶,然后退出。
3、更改密碼: password 命令
SQL> conn scott/lifei23
已連接。
SQL> show user;
USER 為 "SCOTT"
SQL> password
更改 SCOTT 的口令
舊口令: *******
新口令:******
重新鍵入新口令:******
口令已更改
SQL> conn scott/123456
已連接。
這個 是當前用戶 修改自己的密碼,所以需要原來的密碼。
下面利用管理員權限修改密碼,這個時候相當於要求管理員修改密碼,那么管理員是可以不記得某個具體用的密碼的,所以當管理員在修改密碼的時候,是不需要原來的密碼的。
SQL> conn system/lifei23
已連接。
SQL> password scott
更改 scott 的口令
新口令:*******
重新鍵入新口令:*******
口令已更改
SQL> conn scott/lifei23;
已連接。
4、exit命令
exit 命令就直接退出了,好在 需要記錄的內容都被記錄了。
這里如果 剛剛最終修改的結果是lifei23 那么一切安全,要不登錄都登陸不上去了。。。
5、導入命令 start 或者 @
SQL> start f:/test/chaoshen.sql
未選定行
那應該是寫對了在 f:/test 目錄下新建了一個 文件 叫做 chaoshen.sql 里面有一句話:
Select * from goods_tb;按照之前的結果 如果 表中沒有結果 那么返回的結果就是:未選定行。
這個 利用@ 也可以實現。就是 在這里面start 和 @ 是等效的。
然后有一個 edit 命令 可以用來修改 這個 文件,要加全路徑。
然后再次執行看看什么效果:
未選定行
6、編輯命令 edit
SQL> edit f:/test/chaoshen.sql
SQL> @ f:/test/chaoshen.sql
已創建 1 行。
看這意思 insert 語句 是對的。
嘿嘿
SQL> edit f:/test/chaoshen.sql
SQL> start f:/test/chaoshen.sql
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA
-------- ------------------------------ ----------- --------
GOODS_PROVIDER
------------------------------
1 shangpin1 50 weijin
33
SQL> show linesize
linesize 80
SQL> set linesize 120
SQL> show linesize
linesize 120
SQL> @ f:/test/chaoshen.sql
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ------------------------------ ----------- -------- ------------------------------
1 shangpin1 50 weijin 33
SQL> alter table goods_tb modify(goods_name varchar2(10));
表已更改。
SQL> select * from goods_tb
2
SQL> select * from goods_tb;
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ---------- ----------- -------- -----------------
1 shangpin1 50 weijin 33
嘿嘿,這樣就很好看了。
最起碼很整齊。
SQL> select * from goods_tb;
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ---------- ----------- -------- ----------------------------
1 shangpin1 50 weijin 33
2 weijin 35 yongpin 33
7、導出命令:spool 【會覆蓋更新】
SQL> spool f:/test/record.txt
SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin',letben)
2
SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin',letben);
insert into goods_tb values(3,'qiaokeli',30,'shipin',letben)
*
第 1 行出現錯誤:
ORA-00984: 列在此處不允許
SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin','letben');
已創建 1 行。
SQL> spool end;
然后就可以 到上面加黑字體路徑下面找到那個 文件,發現這樣一些內容。
linesize 好像剛剛我們試驗過。
SQL> spool f:/test/record.txt
SQL> select * from goods_tb;
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ---------- ----------- -------- --------------
1 shangpin1 50 weijin 33
2 weijin 35 yongpin 33
3 qiaokeli 30 shipin letben
SQL> spool off;
發現spool off 具有 跟 end 一樣的效果。
然后 如果 文件名相同的話,之前的內容會被覆蓋更新。也就是 不復存在。所以 在創建時,要留心,判定一下是否要 執行覆蓋操作。
Show linesize 展示每行展示多少列 默認80列 也就是80個字符。
可以利用 :Set linesize 120; 命令 修改 列長
Show pagesize 展示每頁顯示多少行,默認 14行。
可以 利用 set pagesize 30;
在 Oracle SQL*Plus 這個界面里面, pagesize 為 1或者 2的時候,顯示效果是相同的,都是只有 那單獨的一行查詢結果:
當設置pagesize 為 3的時候 ,才能顯示齊全的效果。
SQL> set pagesize 2;
SQL> select * from goods_tb;
1 shangpin1 50 weijin 33
2 weijin 35 yongpin 33
3 qiaokeli 30 shipin letben
SQL> set pagesize 3;
SQL> select * from goods_tb;
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ---------- ----------- -------- ---------------
1 shangpin1 50 weijin 33
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ---------- ----------- -------- ---------------
2 weijin 35 yongpin 33
GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER
-------- ---------- ----------- -------- ---------------
3 qiaokeli 30 shipin letben
SQL> set pagesize 1;
SQL> select * from goods_tb;
1 shangpin1 50 weijin 33
2 weijin 35 yongpin 33
3 qiaokeli 30 shipin letben
8、 Create 命令 創建用戶命令
創建用戶 必須要給出密碼,如果不給,是不允許創建的
SQL> create user lifei identified by 111;
create user lifei identified by 111
*
第 1 行出現錯誤:
ORA-00988: 口令缺失或無效
新創建的用戶並不具有,鏈接數據庫的權限。
SQL> create user lifei identified by lifei;
create user lifei identified by lifei
*
第 1 行出現錯誤:
ORA-01031: 權限不足
SQL> conn system/lifei23;
已連接。
SQL> create user lifei identified by lifei;
用戶已創建。
SQL> conn lifei/lifei;
ERROR:
ORA-01045: user LIFEI lacks CREATE SESSION privilege; logon denied
警告: 您不再連接到 ORACLE。
在可視化界面上是可以看到這樣一個 用戶的存在的。但是由於沒有權限的緣故 並不能夠登錄。
所以 要先 drop 掉 這個 用戶 然后 在增加,一個 用戶。
9、刪除一個 用戶。Drop user userName
SQL> conn system/lifei23;
已連接。
SQL> show user;
USER 為 "SYSTEM"
SQL> drop user lifei;
用戶已刪除。
創建用戶並且 修改密碼,這里面的修改 也只能 跟當時創建一樣,不能用數字開頭。
SQL> show user;
USER 為 "SYSTEM"
SQL> create user lifei identified by lifei;
用戶已創建。
SQL> alter user lifei identified by letben;
用戶已更改。
【實例是數據庫服務器內存和相關處理程序】
有三個 可以 賦給 用戶的權限 connect dba 和 resource 。
Connect:分別代表獲得鏈接的權限允許當前用戶可以登錄上這個 數據庫文件編輯系統。
dba 最高權限
Resource 資源 數據庫的 增刪改查權限。
所以按照 權限大小進行划分是:
Connect 只連接
Resource 增刪改查
Dba最高權限 新建數據庫。
10、授權
可是 不級聯的話,表 哪去了?
數據庫下面有很多人,人的下面有很多表。如果刪了人,那 表怎么辦?
SQL> conn system/lifei23;
已連接。
SQL> create user lifei1 identified by lifei1;
用戶已創建。
SQL> grant resource to lifei1;
授權成功。
SQL> connect lifei1/lifei1;
ERROR:
ORA-01045: user LIFEI1 lacks CREATE SESSION privilege; logon denied
警告: 您不再連接到 ORACLE。
新建用戶之后,不過 不賦權限 連登陸都登錄不上去。。。
如果 用戶身上本身就是有表的,此時刪除該用戶時 不指定 cascade的話 還不可以刪除。由於這個表的緣故。
想了一個這樣的事情,創建lifei1 創建 表,插入 元組,賦給 lifei2查詢權限,然后連帶刪除lifei1,然后再次 創建lifei1和 表,並插入元組,此時再次利用lifei2查詢 並不能查詢到結果。雖然同名同姓,卻 已物是人非。
11、Revoke 召回權限
Revoke resource from lifei1。
如果用戶缺少session的話 需要 賦 一個 connect 的權限。
Session 是與數據庫溝通的權限。也就是connect。
SQL> conn lifei1;
輸入口令: ******
ERROR:
ORA-01045: user LIFEI1 lacks CREATE SESSION privilege; logon denied
警告: 您不再連接到 ORACLE。
SQL> conn system/lifei23;
已連接。
SQL> grant connect to lifei1;
授權成功。
SQL> conn lifei1/lifei1;
已連接。
好像后面插入的數據還在上面兒呢~
賦予 單獨的某個權限。比如 增加。那修改 刪除,都是這樣的。
SQL> show user;
USER 為 "LIFEI2"
SQL> conn lifei1/lifei1;
已連接。
SQL> grant insert on test_tb to lifei2;
授權成功。
SQL> conn lifei2/lifei2;
已連接。
SQL> insert into lifei1.test_tb values(2,'ss');
已創建 1 行。
SQL> select * from lifei1.test_tb;
TEST_ID TEST_NAME
---------- --------------------
2 ss
1 letben
關於表的具體查詢要一個 一個賦值,也可一起賦值 利用 all這個 詞。
SQL> conn lifei1/lifei1;
已連接。
SQL> grant all on test_tb to lifei2;
授權成功。
賦予所有的功能給lifei2.
連接的權限傳遞。
關於 這個 連接的權限 就是 拿鑰匙開門的例子。很恰當。
傳遞就是:記得在賦權限之余 就是 with admin option。
系統管理員可以直接取消這個 傳遞出去的權限。
然后 對於單個 表上的權限來說的話,傳遞出去 就是 with grant option。
實驗。Resource 和 connect 和 create session。
給權限的時候 沒有都給 但是撤銷的 時候 可以 revoke all on test_tb from lifei2.
給大門權限包括 resource和 connect 和 create session 是 with admin option
給表權限 是 with grant option。
表權限 作為 管理員 貌似 都撤銷不了 但是擁有 表的人 可以 刪除。
問題來了:
如果 管理員給了 lifei1 和 lifei2 兩個人 開大門的權限 兩個 人 可以 互相刪除么?
可以 誰先下手誰牛逼。
SQL> revoke create session from system;
revoke create session from system
*
第 1 行出現錯誤:
ORA-01952: 系統權限未授予 'SYSTEM'
SQL> show user;
USER 為 "LIFEI1"
SQL> conn system/lifei23;
已連接。
SQL> grant connect to lifei1;
授權成功。
SQL> revoke connect from lifei1;
撤銷成功。
SQL> grant connect to lifei1 with admin option;
授權成功。
SQL> conn lifei1/lifei1;
已連接。
SQL> revoke connect from system
2
SQL> revoke connect from system;
revoke connect from system
*
第 1 行出現錯誤:
ORA-01951: ROLE 'CONNECT' 未授予 'SYSTEM'
事實證明 系統管理員的 開門的權限是 無法被剝奪的。
1擁有表,1把權限給了2 with grant option。2把權限給了3with grant option。當1收回2的權限時,3 也不再可以查看 1的表了。
這個里面有知識點: 對於 大門的權限 可以傳遞 收回了,傳遞出去的依然具有權限。但是 對於查看表的權限,依然可以傳遞,但是 一旦從一個 人那里收回了,傳遞出去的人也不再 不可以 查看了。