MySQL遠端連線不上的解決方法
前言
本貼內容紀錄Oracle課程中的學習筆記,和Oracle的課後作業,以及資料庫相關課程的學習筆記,筆記部分使用例項程式碼記錄,不記詳細語法。
使用者管理
1.如果新安裝資料庫後,忘了oracle使用者的密碼,可以用哪些方法重新設定密碼?(從系統使用者sys和普通使用者scoot兩個方面去考慮),針對兩種不同型別的使用者,給出解決問題的具體思路和程式碼。
分兩種情況考慮:
一種是忘記普通使用者(如scoot)
用SYS (或SYSTEM)使用者登入: CONN SYS/PASS_WORD AS SYSDBA;
使用修改語句:ALTER USER user_name IDENTIFIED BY newpass;
ORA-00988: 口令缺失或無效
另一種是管理員使用者(SYS或System)
可以使用ORAPWD.EXE 工具修改密碼。
開始選單->執行->輸入CMD
,開啟命令提示符視窗,輸入如下命令:
orapwd file=D:oracleproduct10.2.0db_1databasepwdctcsys.ora password=Wut1234
或者使用系統模式登陸
cmd中輸入 sqlplus /nolog
使用系統登入
conn / as sysdba;
輸入
alter user sys identified by Wut1234;
使用者以及許可權管理
建立使用者
CREATE USER user1 IDENTIFIED BY user1;
授權 WITH ADMIN OPTION 傳遞
GRANT CREATE SESSION,CREATE TABLE TO user1 WITH ADMIN OPTION;
收回授權
REVOKE CREATE SESSION,CREATE TABLE FROM user1;
將scott模式下的emp表的SELECT,UPDATE,INSERT許可權授予user1使用者(帶 WITH GRANT OPTION 引數)。
CONN scott/tiger GRANT SELECT,INSERT,DELETE ON emp TO user1 WITH GRANT OPTION;
回收使用者user1授予的scott模式下的emp表的SELECT,UPDATE,INSERT許可權。
CONN scott/tiger@orcl
REVOKE SELECT,UPDATE,INSERT ON emp FROM user1;
表空間
建表空間
CREATE TABLESPACE datastudent
DATAFILE '%ORACLE_HOME%databasedatastudent.dbf'
SIZE 100M REUSE
UNIFORM SIZE 128K;
建臨時表空間
CREATE TEMPORARY TABLESPACE tempstudent
TEMPFILE '%ORACLE_HOME%databasetempstudent.dbf'
SIZE 120M REUSE
UNIFORM SIZE 128K;
建使用者並指定表空間
CREATE USER class_mgr IDENTIFIED BY manager DEFAULT TABLESPACE datastudent TEMPORARY TABLESPACE tempstudent;
授權使用者指定許可權
GRANT SELECT ON scott.emp TO class_mgr;
GRANT UPDATE(deptno,dname) ON scott.dept to class_mgr;
手動修改表空間大小
ALTER TABLESPACE data_ts1
ADD DATAFILE
'%ORACLE_HOME%databasedata_ts2.dbf' SIZE|RESIZE 10M; //增加/減少
開啟/關閉自動擴容
ALTER DATABASE DATAFILE
'%ORACLE_HOME%databasedata_ts2.dbf'
AUTOEXTEND ON|OFF NEXT 5M MAXSIZE 100M; //開關
刪除表空間-刪除臨時
ALTER TABLESPACE temp_ts1
DROP TEMPFILE
'%ORACLE_HOME%databasetemp_ts2.dbf';
刪除表空間-刪除資料檔案及約束
DROP TABLESPACE temp_ts1
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;
表空間離線/上線
ALTER TABLESPACE tablespace_name ONLINE|OFFLINE
離線狀態的表空間是不能進行資料訪問的,所對應的所有資料檔案也都處於離線狀態。
表空間讀寫狀態
ALTER TABLESPACE tbs_name
READ ONLY|READ WRITE //可讀 讀寫
Oracle資料型別
常用資料型別:
- VARCHAR2:可變長字串型別,≤4KB
- DATE :固定長度(7B)的日期型。注意儲存與使用格式
- TIMESTAMP:時間戳型別,可更精確的儲存與表示時間
- NUMBER:數字型,可存放實型和整型
- FLOAT:浮點型,可存放實型
不常用資料型別:
- BLOB 大二進位制物件型別,≤4GB
- CLOB 大字串物件型別,≤4GB
- NCLOB:多位元組字符集的CLOB,≤4GB
- BFILE:外部二進位制檔案型別,只讀,大小與OS有關
- ROWID:儲存記錄行的實體地址(2進製表示),固定為10個位元組
特殊型別Date(注意)
用來存放日期時間型別資料,用7個位元組分別描述年、月、日、時、分、秒。 語法格式:
date_field DATE;
預設格式為DD-MON-YY,分別對應日、月、年。
例17-JUN-02。(月份的表達要用英文單詞的縮寫格式)。
日期的格式可以設定為中文格式,例如17-六月-2002。
to_date('2017-03-02','yyyy-mm-dd')
SQL> select to_date('2017-03-02','yyyy-mm-dd') from dual;
Oracle衍生Date型別-TIMESTAMP 不展開贅述
表管理
表是真正儲存各種各樣資料的物件,由行和列組成。行有時也稱為記錄,列有時也稱為欄位或域。設計資料庫時,要決定它包括哪些表,每個表中包含哪些列,每列的資料型別等。
在表中建立列時,必須為其指定資料型別,列的資料型別決定了資料的取值、範圍和儲存格式。
建表
Create Table XS
(XH VARCHAR2 (10) NOT NULL,
XM VARCHAR2 (20) NOT NULL,
ZYM VARCHAR2 (20),
XB VARCHAR2(2) NOT NULL,
CSSJ Date NOT NULL,
ZXF Number(2) DEFAULT 01,
BZ Varchar(200)
);
使用查詢建表
為了儲存原始資料以便於恢復或是得到一個與源表一樣結構的表,可通過子查詢建立表。
CREATE TABLE XS_JSJ
AS SELECT * FROM XS WHERE ZYM='計算機' ;
例為計算機專業的學生建立一個備份表XS_JSJ。
表管理
主要為對列及其屬性的修改
增加列
ALTER TABLE XS ADD
( JXJ NUMBER(1),
DJSM VARCHAR2(40) DEFAULT '獎金1000元'
);
修改列
ALTER TABLE XS
MODIFY ( DJSM DEFAULT '獎金800元' );
刪除列
ALTER TABLE XS
DROP COLUMN DJSM;
修改表名
Alter Table XS Rename To XSCopy;
或
Alter Table XS
RENAME XS TO XSCopy;
修改欄位名
Alter Table xscopy
Rename Column BZ To BZSM;
刪除表
DROP TABLE XS;
表的刪除閃回
FLASHBACK TABLE XS TO BEFORE DROP;
注意:管理員sys是沒有回收站,請儘量不要在sys使用者下建立表
語法:FLASHBACK TABLE 表名TO BEFORE DROP;
此命令可用於恢復誤刪除的表、檢視和索引。
徹底刪除表
無法閃回
DROP TABLE XS PURGE;
臨時表
臨時表的特點:
- 多使用者操作的獨立性:對於使用同一張臨時表的不同使用者,ORACLE都會分配一個獨立的臨時表,這樣就避免了多個使用者在對同一張臨時表操作時發生交叉,從而保證了多個使用者操作的併發性和獨立性;
- 資料的臨時性:既然是臨時表,顧名思義,存放在該表中的資料是臨時性的。ORACLE根據你建立臨時表時指定的引數(On Commit Delete Rows / On Commit Preserve Rows),自動將資料TRUNCATE掉。
會話級臨時表
會話級的臨時表因為這這個臨時表中的資料和你的當前會話有關係,當你當前SESSION不退出的情況下,臨時表中的資料就還存在,而當你退出當前SESSION的時候,臨時表中的資料就全部沒有了,當然這個時候你如果以另外一個SESSION登陸的時候是看不到另外一個SESSION中插入到臨時表中的資料的。即兩個不同的SESSION所插入的資料是互不相干的。當某一個SESSION退出之後臨時表中的資料就被截斷(truncate table,即資料清空)了。會話級的臨時表建立方法:
Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Preserve Rows;
事務級臨時表
事務級臨時表是指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的資料將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION的時候,事務級的臨時表也會被自動截斷)。事務級臨時表的建立方法:
Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Delete Rows;
兩中型別臨時表的區別
會話級臨時表採用on commit preserve rows;而事務級則採用on commit delete rows;用法上,會話級別只有當會話結束臨時表中的資料才會被截斷,而且事務級臨時表則不管是commit、rollback或者是會話結束,臨時表中的資料都將被截斷
約束
主鍵約束,外來鍵約束,特殊約束等
手機號約束
ALTER TABLE EMPLOYEES
ADD ( CONSTRAINT "CH_PHONE_CHECK" CHECK (phonenumber between '000000000000' and '999999999999') ) ;
索引
在Oracle 中,索引是為了加速對錶中元組的檢索而建立的一種分散儲存結構; 索引是對錶而建立的,由除存放表的資料頁面以外的索引頁面組成,獨立於被索引的表。
注意:索引增加了查詢的速度,但是會降低插入,修改,刪除的速度,故縣插入資料,後建立索引。
- 索引中儲存了記錄的關鍵字和ROWID
- 索引在邏輯上和物理上都與相關表的資料無關
- 索引需要單獨的儲存空間。否則使用表所在表空間
- 建立或刪除一個索引不會影響基於資料表的資料庫應用或其他索引
- 建立索引後一般會增加資料更新操作的執行時間
B-樹索引(B-tree index)
B*樹索引儲存結構類似書的索引結構,有分支和葉兩種型別的儲存資料塊(葉子塊資料是排序的,從左向右遞增; 在分支塊和根塊中放的是索引的範圍 ),分支塊相當於書的大目錄,葉塊相當於索引到的具體的書頁。
對於取值範圍很大的列應當建立B樹索引。
點陣圖索引
點陣圖索引儲存主要用來節省空間,減少ORACLE對資料塊的訪問,它採用點陣圖偏移方式來與表的行ID號對應。( 每一個BIT(值是1或0)對應著一個ROWID。是1表示著BIT對應的ROWID有值;)
對於取值範圍很小的列應當建立點陣圖索引。
條件
- 索引的表或簇必須在自己的模式中;
- 必須在要索引的表上具有INDEX許可權;
- 必須具有CREATE ANY INDEX許可權。
建立索引
CONN scott/tiger@orcl
CREATE INDEX kc_kcm_index
ON kc(kcm DESC)
TABLESPACE my_index;
預設情況下,索引中資料按升序(ASC)排列
檢視
檢視(view),也稱虛表, 不佔用物理空間,這個也是相對概念,因為檢視本身的定義語句還是要儲存在資料字典裡的。檢視只有邏輯定義。每次使用的時候, 只是重新執行SQL.
檢視是從一個或多個實際表中獲得的,這些表的資料存放在資料庫中。那些用於產生檢視的表叫做該檢視的基表。一個檢視也可以從另一個檢視中產生。
檢視的定義存在資料庫中,與此定義相關的資料並沒有再存一份於資料庫中。通過檢視看到的資料存放在基表中。
檢視看上去非常象資料庫的物理表,對它的操作同任何其它的表一樣。當通過檢視修改資料時,實際上是在改變基表中的資料;相反地,基表資料的改變也會自動反映在由基表產生的檢視中。由於邏輯上的原因,有些Oracle檢視可以修改對應的基表,有些則不能(僅僅能查詢)。
需要給予檢視許可權
-- 給予建立檢視許可權
conn system
GRANT create view TO McswAdmin;
建立檢視
create or replace view vw_Users_Buy
as
select "Users_Id","Goods_Id","Tr_Num"
from Transaction_Log
order by "Tr_Id";
PL/SQL程式塊
PL/SQL程式塊是PL/SQL程式的基本單元,按照指定的方式,進行定義的一段程式。
概念等內容參考 PL/Sql語句塊
示例:
--序列
create sequence Users_sequence
increment by 1
start with 10000020
nomaxvalue
nocycle
nocache
--觸發器
CREATE TRIGGER Users_idadd
BEFORE INSERT ON Users
FOR EACH ROW
WHEN(NEW."Users_Id" is null) --當輸入ID為空時啟動觸發器
BEGIN
select Users_sequence.nextval into :new."Users_Id" from sys.dual;
END;
--建立good_check函式,檢查商品的對應遊戲物品ID
CREATE OR REPLACE FUNCTION good_check
(f_goodsid Goods."Goods_Id"%type
)
RETURN Goods."Goods_Game_id"%TYPE
AS
v_g_rname Goods."Goods_Game_id"%TYPE;
BEGIN
select "Goods_Game_id" into v_g_rname FROM Goods
where "Goods_Id"=f_goodsid;
RETURN v_g_rname ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('沒有找到對應遊戲物品!');
END good_check;
--呼叫good_check輸入Goods_Id和Goods_Game_id檢查商品的對應遊戲物品ID
select good_check('ces01') from dual;