本文聚焦 DML 與 DCL。
| 語句 | 用途 |
|---|---|
| INSERT | 新增資料列 |
| UPDATE | 修改現有資料 |
| DELETE | 刪除資料列 |
| SELECT FOR UPDATE | 鎖定列,阻擋其他 DML |
| LOCK TABLE | 鎖定整張表 |
COLUMN_ID)NULL 關鍵字或空字串均可插入 NULL 值-- 等價寫法
INSERT INTO customers(cust_id, state, post_code) VALUES ('Ariel', NULL, '94501');
INSERT INTO customers(cust_id, state, post_code) VALUES ('Ariel', , '94501');
UPDATE order_rollup
SET (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 FROM po_lines
WHERE ship_to_state IN ('TX','NY','IL') AND order_date < ...;
TRUNCATE TABLE [schema.]table [DROP|REUSE STORAGE];
與 DELETE 差異:
查詢時加 FOR UPDATE 鎖定符合條件列,其他 Session 可查不可改。
LOCK TABLE inventory IN EXCLUSIVE MODE; -- 排他鎖
LOCK TABLE inventory IN SHARE MODE; -- 共享鎖
雙向等待鎖釋放,Oracle 自動偵測拋出異常。
| 語句 | 用途 |
|---|---|
| COMMIT | 提交交易,永久生效 |
| ROLLBACK | 回滾交易,撤銷所有變更 |
| ROLLBACK TO SAVEPOINT | 部分回滾至存檔點 |
| SET TRANSACTION | 設定隔離層級/指定 Rollback Segment |
BEGIN
UPDATE checking SET balance=balance-5000 WHERE account='Kiesha';
INSERT INTO checking_log VALUES (SYSDATE,'Transfer',-5000);
UPDATE brokerage SET cash_balance=cash_balance+5000 WHERE account='Kiesha';
INSERT INTO brokerage_log VALUES (SYSDATE,'Transfer',5000);
COMMIT;
EXCEPTION WHEN OTHERS THEN ROLLBACK; END;
BEGIN
INSERT INTO atm_log VALUES ('Kiesha',SYSDATE,'Withdrawal','ATM54');
SAVEPOINT atm_logged;
UPDATE checking SET balance=balance-100 RETURN balance INTO new_bal;
IF new_bal < 0 THEN
ROLLBACK TO atm_logged; -- 僅回滾扣款,保留 log
COMMIT;
RAISE insufficient_funds;
END IF;
END;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED:Statement-level (預設)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE:Transaction-levelSET TRANSACTION READ ONLY:唯讀交易,僅允許 SELECT/LOCK/SET ROLE/ALTER SYSTEM/ALTER SESSIONSET TRANSACTION USE ROLLBACK SEGMENT rb_large;
大量作業預先指定大 Rollback Segment,避免動態擴展撐爆表空間。
-- 建立使用者
CREATE USER piyush IDENTIFIED BY welcome
DEFAULT TABLESPACE user_data
TEMPORARY TABLESPACE temp_data
QUOTA UNLIMITED ON user_data
QUOTA 20M ON tools
PROFILE app_user;
-- 修改屬性
ALTER USER manoj DEFAULT TABLESPACE dev1_data;
ALTER USER manoj QUOTA 2500K ON tools;
ALTER USER manoj PROFILE dev_profile;
ALTER USER manoj DEFAULT ROLE ALL EXCEPT salary_adm;
ALTER USER manoj PASSWORD EXPIRE; -- 下次登入強制改密
ALTER USER ql ACCOUNT LOCK; -- 鎖定帳號
ALTER USER ql ACCOUNT UNLOCK; -- 解鎖
CREATE ROLE role_name [IDENTIFIED BY password | IDENTIFIED EXTERNALLY | IDENTIFIED GLOBALLY];
IDENTIFIED BY 需 SET ROLE role_name IDENTIFIED BY pwd 啟用,適合應用程式內嵌安全| 權限 | TABLE | VIEW | SEQUENCE | PROCEDURE/FUNCTION/PACKAGE |
|---|---|---|---|---|
| SELECT | ✓ | ✓ | ✓ | |
| INSERT | ✓ | ✓ | ||
| UPDATE | ✓ | ✓ | ||
| DELETE | ✓ | ✓ | ||
| EXECUTE | ✓ | |||
| ALTER | ✓ | ✓ | ||
| INDEX | ✓ | |||
| REFERENCES | ✓ |
ALL 權限 = 該物件所有適用權限 (如 TABLE 的 ALL = SELECT,INSERT,UPDATE,DELETE,ALTER,INDEX,REFERENCES)。
GRANT system_priv TO user|role|PUBLIC [WITH ADMIN OPTION];
注意:系統權限用 WITH ADMIN OPTION,物件權限用 WITH GRANT OPTION,混用會報錯。
GRANT role|sys_priv TO grantee [WITH ADMIN OPTION];
GRANT obj_priv ON object TO grantee [WITH GRANT OPTION];
REVOKE role|sys_priv FROM grantee;
REVOKE obj_priv ON object FROM grantee;
| 視圖 | 用途 |
|---|---|
| DBA_TAB_PRIVS | 全資料庫物件權限 (含 GRANT OPTION) |
| DBA_ROLE_PRIVS | 使用者/角色獲授角色 |
| DBA_SYS_PRIVS | 使用者/角色獲授系統權限 |
| USER_TAB_PRIVS | 當前使用者物件權限 |
| SESSION_PRIVS | 當前 Session 可用系統權限 |
考試重點:DBA_TAB_PRIVS 包含表、函數、套件、佇列等所有物件權限,不限於表。