對(duì)于MySQL角色的概念要有明確的了解和認(rèn)知。
創(chuàng)新互聯(lián)建站認(rèn)為,企業(yè)網(wǎng)站是要賦予品質(zhì)、思維、人性,深入到用戶內(nèi)心的細(xì)膩情感,才能真正稱得上企業(yè)網(wǎng)站。創(chuàng)新互聯(lián)建站根據(jù)每位用戶內(nèi)心最深的需求網(wǎng)站建設(shè)服務(wù),堅(jiān)實(shí)的設(shè)計(jì)執(zhí)行是品牌長期視覺塑造的重要支持。
角色一直存在各個(gè)數(shù)據(jù)庫中,比如 SQL Server、Oracle 等,MySQL 自從版本 8.0 release,引入了角色這個(gè)概念。
角色的概念
角色就是一組針對(duì)各種數(shù)據(jù)庫權(quán)限的集合。比如,把一個(gè)角色分配給一個(gè)用戶,那這個(gè)用戶就擁有了這個(gè)角色包含的所有權(quán)限。一個(gè)角色可以分配給多個(gè)用戶,另外一個(gè)用戶也可以擁有多個(gè)角色,兩者是多對(duì)多的關(guān)系。不過 MySQL 角色目前還沒有提供類似于其他數(shù)據(jù)庫的系統(tǒng)預(yù)分配的角色。比如某些數(shù)據(jù)庫的 db_owner、 db_datareader 、 db_datawriter 等等。那接下來我分幾個(gè)方面,來示例說明角色的使用以及相關(guān)注意事項(xiàng)。
示例 1:一個(gè)完整角色的授予步驟
用管理員創(chuàng)建三個(gè)角色:db_owner, db_datareader, db_datawriter
mysql create role db_owner,db_datareader,db_datawriter;
Query OK, 0 rows affected (0.02 sec)
mysql grant all on ytt_new.* to db_owner;
Query OK, 0 rows affected (0.01 sec)
mysql grant select on ytt_new.* to db_datareader;
Query OK, 0 rows affected (0.01 sec)
mysql grant insert,delete,update on ytt_new.* to db_datawriter;
Query OK, 0 rows affected (0.01 sec)
創(chuàng)建三個(gè)普通用戶,分別為 ytt1、ytt2、ytt3。mysql create user ytt1 identified by 'ytt',ytt2 identified by 'ytt',ytt3 identified by 'ytt';Query OK, 0 rows affected (0.01 sec)
分別授予這三個(gè)用戶對(duì)應(yīng)的角色。
-- 授權(quán)角色
mysql grant db_owner to ytt1;
Query OK, 0 rows affected (0.02 sec)
-- 激活角色
mysql set default role db_owner to ytt1;
Query OK, 0 rows affected (0.00 sec)
mysql grant db_datareader to ytt2;
Query OK, 0 rows affected (0.01 sec)
mysql set default role db_datareader to ytt2;
Query OK, 0 rows affected (0.01 sec)
mysql grant db_datawriter to ytt3;
Query OK, 0 rows affected (0.01 sec)
mysql set default role db_datawriter to ytt3;
Query OK, 0 rows affected (0.01 sec)
以上是角色授予的一套完整步驟。那上面有點(diǎn)非常規(guī)的地方是激活角色這個(gè)步驟。MySQL 角色在創(chuàng)建之初默認(rèn)是沒有激活的,也就是說創(chuàng)建角色,并且給一個(gè)用戶特定的角色,這個(gè)用戶其實(shí)并不能直接使用這個(gè)角色,除非激活了才可以。
示例 2:一個(gè)用戶可以擁有多個(gè)角色
-- 用管理員登錄并且創(chuàng)建用戶
mysql create user ytt4 identified by 'ytt';
Query OK, 0 rows affected (0.00 sec)
-- 把之前的三個(gè)角色都分配給用戶ytt4.
mysql grant db_owner,db_datareader,db_datawriter to ytt4;
Query OK, 0 rows affected (0.01 sec)
-- 激活用戶ytt4的所有角色.
mysql set default role all to ytt4;
Query OK, 0 rows affected (0.02 sec)
-- ytt4 用戶登錄
root@ytt-pc:/var/lib/mysql# mysql -uytt4 -pytt -P3304 -hytt-pc
...
-- 查看當(dāng)前角色列表
mysql select current_role();
+--------------------------------------------------------+
| current_role() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
+--------------------------------------------------------+
| `db_datareader`@`%`,`db_datawriter`@`%`,`db_owner`@`%` |
+--------------------------------------------------------+
1 row in set (0.00 sec)
-- 簡單創(chuàng)建一張表并且插入記錄, 檢索記錄,完了刪掉這張表
mysql use ytt_new
Database changed
mysql create table t11(id int);
Query OK, 0 rows affected (0.05 sec)
mysql insert into t11 values (1);
Query OK, 1 row affected (0.02 sec)
mysql select * from t11;
+------+
| id ? |
+------+
| ? ?1 |
+------+
1 row in set (0.00 sec)
mysql drop table t11;
Query OK, 0 rows affected (0.04 sec)
示例 3:用戶在當(dāng)前 session 里角色互換
其實(shí)意思是說,用戶連接到 MySQL 服務(wù)器后,可以切換當(dāng)前的角色列表,比如由 db_owner 切換到 db_datareader。
-- 還是之前的用戶ytt4, 切換到db_datareader
mysql set role db_datareader;
Query OK, 0 rows affected (0.00 sec)
mysql select current_role();
+---------------------+
| current_role() ? ? ?|
+---------------------+
| `db_datareader`@`%` |
+---------------------+
1 row in set (0.00 sec)
-- 切換后,沒有權(quán)限創(chuàng)建表
mysql create table t11(id int);
ERROR 1142 (42000): CREATE command denied to user 'ytt4'@'ytt-pc' for table 't11'
-- 切換到 db_owner,恢復(fù)所有權(quán)限。
mysql set role db_owner;
Query OK, 0 rows affected (0.00 sec)
mysql create table t11(id int);
Query OK, 0 rows affected (0.04 sec)
示例 4:關(guān)于角色的兩個(gè)參數(shù)
activate_all_roles_on_login:是否在連接 MySQL 服務(wù)時(shí)自動(dòng)激活角色mandatory_roles:強(qiáng)制所有用戶默認(rèn)角色
-- 用管理員連接MySQL,
-- 設(shè)置默認(rèn)激活角色
mysql set global activate_all_roles_on_login=on;
Query OK, 0 rows affected (0.00 sec)
-- 設(shè)置強(qiáng)制給所有用戶賦予角色db_datareader
mysql set global mandatory_roles='db_datareader';
Query OK, 0 rows affected (0.00 sec)
-- 創(chuàng)建用戶ytt7.
mysql create user ytt7;
Query OK, 0 rows affected (0.01 sec)
-- 用 ytt7登錄數(shù)據(jù)庫
root@ytt-pc:/var/lib/mysql# mysql -uytt7 -P3304 -hytt-pc
...
mysql show grants;
+-------------------------------------------+
| Grants for ytt7@% ? ? ? ? ? ? ? ? ? ? ? ? |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `ytt7`@`%` ? ? ? ? ?|
| GRANT SELECT ON `ytt_new`.* TO `ytt7`@`%` |
| GRANT `db_datareader`@`%` TO `ytt7`@`%` ? |
+-------------------------------------------+
3 rows in set (0.00 sec)
示例 5 :create role 和 create user 都有創(chuàng)建角色權(quán)限,兩者有啥區(qū)別?
以下分別創(chuàng)建兩個(gè)用戶 ytt8、ytt9,一個(gè)給 create role,一個(gè)給 create user 權(quán)限。
-- 管理員登錄,創(chuàng)建用戶ytt8,ytt9.
mysql create user ytt8,ytt9;
Query OK, 0 rows affected (0.01 sec)
mysql grant create role on *.* to ytt8;
Query OK, 0 rows affected (0.02 sec)
mysql grant create user on *.* to ytt9;
Query OK, 0 rows affected (0.01 sec)
-- 用ytt8 登錄,
root@ytt-pc:/var/lib/mysql# mysql -uytt8 -P3304 -hytt-pc
...
mysql create role db_test;
Query OK, 0 rows affected (0.02 sec)
-- 可以創(chuàng)建角色,但是不能創(chuàng)建用戶
mysql create user ytt10;
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation
mysql \q
Bye
-- 用ytt9 登錄
root@ytt-pc:/var/lib/mysql# mysql -uytt9 -P3304 -hytt-pc
...
-- 角色和用戶都能創(chuàng)建
mysql create role db_test2;
Query OK, 0 rows affected (0.02 sec)
mysql create user ytt10;
Query OK, 0 rows affected (0.01 sec)
mysql \q
Bye
那這里其實(shí)看到 create user 包含了 create role,create user 即可以創(chuàng)建用戶,也可以創(chuàng)建角色。
示例 6:MySQL 用戶也可以當(dāng)角色來用
-- 用管理員登錄,創(chuàng)建用戶ytt11,ytt12.
mysql create user ytt11,ytt12;
Query OK, 0 rows affected (0.01 sec)
mysql grant select on ytt_new.* to ytt11;
Query OK, 0 rows affected (0.01 sec)
-- 把ytt11普通用戶的權(quán)限授予給ytt12
mysql grant ytt11 to ytt12;
Query OK, 0 rows affected (0.01 sec)
-- 來查看 ytt12的權(quán)限,可以看到擁有了ytt11的權(quán)限
mysql show grants for ytt12;
+-----------------------------------+
| Grants for ytt12@% ? ? ? ? ? ? ? ?|
+-----------------------------------+
| GRANT USAGE ON *.* TO `ytt12`@`%` |
| GRANT `ytt11`@`%` TO `ytt12`@`%` ?|
+-----------------------------------+
2 rows in set (0.00 sec)
-- 在細(xì)化點(diǎn),看看ytt12擁有哪些具體的權(quán)限
mysql show grants for ytt12 using ytt11;
+--------------------------------------------+
| Grants for ytt12@% ? ? ? ? ? ? ? ? ? ? ? ? |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `ytt12`@`%` ? ? ? ? ?|
| GRANT SELECT ON `ytt_new`.* TO `ytt12`@`%` |
| GRANT `ytt11`@`%` TO `ytt12`@`%` ? ? ? ? ? |
+--------------------------------------------+
3 rows in set (0.00 sec)
示例 7:角色的撤銷
角色撤銷和之前權(quán)限撤銷類似。要么 revoke,要么刪除角色,那這個(gè)角色會(huì)從所有擁有它的用戶上移除。
-- 用管理員登錄,移除ytt2的角色
mysql revoke db_datareader from ytt2;
Query OK, 0 rows affected (0.01 sec)
-- 刪除所有角色
mysql drop role db_owner,db_datareader,db_datawriter;
Query OK, 0 rows affected (0.01 sec)
-- 對(duì)應(yīng)的角色也從ytt1上移除掉了
mysql show grants for ytt1;
+----------------------------------+
| Grants for ytt1@% ? ? ? ? ? ? ? ?|
+----------------------------------+
| GRANT USAGE ON *.* TO `ytt1`@`%` |
+----------------------------------+
1 row in set (0.00 sec)
至此,我分了 7 個(gè)目錄說明了角色在各個(gè)方面的使用以及注意事項(xiàng),希望對(duì)大家有幫助。
布爾值 NULL ,false, 0 ," " ,都代表為假, mysql_query 對(duì)于 SELECT,SHOW,EXPLAIN 或 DESCRIBE 語句返回一個(gè)資源標(biāo)識(shí)符,打印出來是 類似于 “Resource id #3" 的一個(gè)字符串,所以就為真了。 這個(gè) “Resource id #3" 就好比是一個(gè)指示牌, 連接著你要操作的數(shù)據(jù),用函數(shù)操作他時(shí),例如:mysql_fetch_array($insert), 他就把從數(shù)據(jù)庫調(diào)出來的結(jié)果帶到函數(shù)里做參數(shù)了。
可以通過查詢系統(tǒng)表來獲取。
1、打開Navicat for Mysql,登錄到指定數(shù)據(jù)庫下。
2、新建查詢。
3、輸入以下語句:
1
select column_name from information_schema.COLUMNS where table_name='表名'
結(jié)果:
其中id和name就是test表的字段名字。
MySQL實(shí)現(xiàn)類似Oracle的序列
Oracle一般使用序列(Sequence)來處理主鍵字段,而MySQL則提供了自增長(increment)來實(shí)現(xiàn)類似的目的;
但在實(shí)際使用過程中發(fā)現(xiàn),MySQL的自增長有諸多的弊端:不能控制步長、開始索引、是否循環(huán)等;若需要遷移數(shù)據(jù)庫,則對(duì)于主鍵這塊,也是個(gè)頭大的問題。
本文記錄了一個(gè)模擬Oracle序列的方案,重點(diǎn)是想法,代碼其次。
Oracle序列的使用,無非是使用.nextval和.currval偽列,基本想法是:
1、MySQL中新建表,用于存儲(chǔ)序列名稱和值;
2、創(chuàng)建函數(shù),用于獲取序列表中的值;
具體如下:
表結(jié)構(gòu)為:
drop
table
if
exists
sequence;
create
table
sequence
(
seq_name
VARCHAR(50)
NOT
NULL,
--
序列名稱
current_val
INT
NOT
NULL,
--當(dāng)前值
increment_val
INT
NOT
NULL
DEFAULT
1,
--步長(跨度)
PRIMARY
KEY
(seq_name)
);
實(shí)現(xiàn)currval的模擬方案
create
function
currval(v_seq_name
VARCHAR(50))
returns
integer
begin
declare
value
integer;
set
value
=
0;
select
current_value
into
value
from
sequence
where
seq_name
=
v_seq_name;
return
value;
end;
函數(shù)使用為:select
currval('MovieSeq');
實(shí)現(xiàn)nextval的模擬方案
create
function
nextval
(v_seq_name
VARCHAR(50))
return
integer
begin
update
sequence
set
current_val
=
current_val
+
increment_val
where
seq_name
=
v_seq_name;
return
currval(v_seq_name);
end;
函數(shù)使用為:select
nextval('MovieSeq');
增加設(shè)置值的函數(shù)
create
function
setval(v_seq_name
VARCHAR(50),
v_new_val
INTEGER)
returns
integer
begin
update
sequence
set
current_val
=
v_new_val
where
seq_name
=
v_seq_name;
return
currval(seq_name);
同理,可以增加對(duì)步長操作的函數(shù),在此不再敘述。
注意語法,數(shù)據(jù)庫字段要對(duì)應(yīng)上
use
bvboms;
DELIMITER
$$
create
function
setval(v_seq_name
VARCHAR(50),
v_new_val
INTEGER)
returns
integer
begin
update
sequence
set
current_val
=
v_new_val
where
seq_name
=
v_seq_name;
return
currval(seq_name);
end
$$
DELIMITER
$$
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
您可能感興趣的文章:mysql實(shí)現(xiàn)sequence功能的代碼Can''t
connect
to
local
MySQL
through
socket
''/tmp/mysql.sock''解決方法Mysql常用函數(shù)大全(分類匯總講解)利用MySQL主從配置實(shí)現(xiàn)讀寫分離減輕數(shù)據(jù)庫壓力mysql+spring+mybatis實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的代碼配置Golang中如何對(duì)MySQL進(jìn)行操作詳解將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫中的幾種方法MySQL存儲(chǔ)文本和圖片的方法Ubuntu上mysql的安裝及使用(通用版)nodejs同步調(diào)用獲取mysql數(shù)據(jù)時(shí)遇到的大坑
java中怎樣創(chuàng)建MySQL數(shù)據(jù)庫列表 需要使用jdbc訪問數(shù)據(jù)庫。
具體步驟如下:
1:加載驅(qū)動(dòng) ,返回連接
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/student";
private static final String DATABASE_USRE = "root";
private static final String DATABASE_PASSWORD = "cs";
/**
* 返回連接
*
* @return Connection
*/
public static Connection getConnection() {
Connection dbConnection = null;
try {
Class.forName(DRIVER_CLASS);
dbConnection = DriverManager.getConnection(DATABASE_URL,
DATABASE_USRE, DATABASE_PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return dbConnection;
}
2:獲取連接,執(zhí)行sql語句
public static List selectAllStudent() {
Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;
List list = new ArrayList();
String sql = "select * from Student ";
try {
con = ConnectionManager.getConnection();
pstm = con.prepareStatement(sql);
// pstm.setString(1, uname);
rs = pstm.executeQuery();
while (rs.next()) {
Student model = new Student();
model.setStuId(rs.getInt("stuId"));
list.add(model);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionManager.closeResultSet(rs);
ConnectionManager.closeStatement(pstm);
ConnectionManager.closeConnection(con);
}
return list;
}
3:調(diào)用獲取列表方法。
FIND_IN_SET是絕對(duì)匹配類型的。例如id為1,那么返回2。直接匹配到1上。而不會(huì)匹配到11上
在mybatis的xml中,實(shí)現(xiàn)方式
bind標(biāo)簽中的value是直接讀取的參數(shù)的 。
bind name="ids" value="a"/ 這樣并不是代表值是a,而是讀取a這個(gè)參數(shù)。
bind name="ids" value=""/不能直接默認(rèn)這樣寫。而是bind name="ids" value="''"/這樣寫,才可以。默認(rèn)為空字符
名稱欄目:MySQL怎么實(shí)現(xiàn)列表 mysql創(chuàng)建列表
網(wǎng)頁路徑:http://m.rwnh.cn/article44/hichhe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、ChatGPT、、動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)