權限梳理
Oracle數據庫和mysql數據庫都有自己的權限管理。Mysql數據庫的權限管理相對oracle數據庫的權限管理會更簡潔。
Mysql的權限認證是通過查詢權限表直接驗證的,不過mysql 的權限表是有等級的。在驗證的過程中,先驗證等級較高的權限表,如果通過驗證則放行,不通過會繼續驗證等級次高的權限表,如果最低的權限表都沒有通過,那麼系統會判定該用戶沒有執行這條命令的權限。
Oracle數據庫有一套基於權限-角色-用戶的權限系統。即:權限可以賦予角色,角色可以賦予用戶,用戶就可以得到該角色的的全部權限。當然也可以單獨爲用戶添加某個權限。
Mysql和oracle數據庫的用戶和表的關係也是不一樣的。Mysql一個用戶,多個數據庫,每個數據庫擁有各自的表,而Oracle一個數據庫,多個用戶,每個用戶擁有各自的表(數據庫對象)
Mysql數據庫的權限表都放在mysql庫中,其中
- mysql.user表存儲全局權限,適用於一個給定服務器中的所有數據庫
- mysql.db和mysql.host表存儲數據庫權限,適用於一個給定數據庫中的所有目標。
- mysql.tables_priv表存儲表權限,適用於一個給定表中的所有列
- mysql.columns_priv表存儲列權限,適用於一個給定表中的單一列。這些權限存儲在中。
ORACLE系統提供三種權限:Object 對象級、System 系統級、Role 角色級。
- Oracle 的角色存放在表 dba_roles
- 某角色包含的系統權限存放在 表dba_sys_privs
- 包含的對象權限存放在 表dba_tab_privs
具體的權限這裏就不列舉了
oracle可以參考官網給出的列表:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GRANT.html#GUID-20B4E2C0-A7F8-4BC8-A5E8-BE61BDC41AC3 表18-1和表18-2
mydql可以參考官網給出的列表:https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html#grant-tables-user-db
系統表梳理
系統表的梳理主要關注的是有關於元數據的系統表,至於其他的系統表這裏暫不做梳理。
Mysql數據庫的information_schema是一個元數據庫。它就像物業公司的信息庫,對管理的每棟大廈有多少電梯、電梯型號、每個房間的長寬高等等瞭如指掌。
常見的元信息表有:
- SCHEMATA提供數據庫信息,有哪些數據庫,字符集是GBK還是UTF-8等等。
- TABLES 提供表的信息,數據庫有哪些表,是什麼存儲引擎等等。
- COLUMNS 提供字段的信息,有哪些字段字段類型是什麼等等。
- STATISTICS 提供索引信息 表中有那些索引,索引的字段、類型等。
- TABLE_CONSTRAINTS 提供表的約束情況
- KEY_COLUMN_USAGE 提供主鍵、外鍵、唯一約束等信息
- ROUTINES 提供函數和存儲過程的信息
- VIEWS 提供數據庫下所有視圖信息
- TRIGGERS 提供所有的觸發器情況
Oracle數據庫將元數據放到靜態數據字典視圖。Oracle元數據獲取可以通過靜態數據字典視圖來獲取。
Oracle數據庫的元數據表同種類型的一般有三張表,前綴分別是:DBA 表示數據庫中所有的 ALL 表示當前用戶可訪問的所有 USER表示當前用戶擁有的
【參考:https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2094.htm 】
- XX_TAB_COMMENTS 顯示錶和視圖的元數據
- XX_TAB_COLUMNS 顯示錶、視圖和集羣的列
- XX_CONS_COLUMNS 顯示約束的元數據
突發奇想
當面對一個數據表很大的時候,我們的業務需求需要查詢一些數據,但是這些數據並不是數據表裏的數據,或許是一些統計數據,例如想拿到一張表的數據行數、數據表中的字節數等數據。我們去查詢數據表效果是不理想的,因爲查詢的數據表如果數據量很大,那麼我們會在這個查詢中消耗較長的時間。
建議如下:如果我們想拿到的數據並不是數據庫表中的數據,那麼我們可以查找數據庫的元數據來拿到我們想要的數據,比如想拿到數據庫中的行數,我們可以查詢數據庫中table表的元數據,裏面會有行數據的統計。相對於使用count來查詢表,效率和時間都會有很大的提升。