MySQL數據庫用戶和權限管理


一、視圖

視圖:VIEW,虛表,保存有實表的查詢結果,在視圖插入的內容都會存入表中。
創建方法:

CREATE VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

查看視圖定義:SHOW CREATE VIEW view_name
刪除視圖:

DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]

視圖中的數據事實上存儲於“基表”中,因此,其修改操作也會針對基表實現;其修改操作受基表限制

(1) 創建一個視圖:

 create view v_students as select stuid,name,age  from  students; 創建一個新的視圖,起名為v_students

 create view v_old_students  as select   stuid,name,age  from  students where age > 50; 將視圖大於50歲以上的名字進行顯示。

 inster v_old_students  values(27,'li',20);此時可以在視圖中添加一個20歲的內容,實際添加到表里邊,而視圖中不會顯示。

二、函數

1、函數:系統函數和自定義函數
     系統函數:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
2、自定義函數 (user-defined function UDF)

 保存在mysql.proc表中
 創建UDF
    CREATE [AGGREGATE] FUNCTION function_name(parameter_name
    type,[parameter_name type,...])
    RETURNS {STRING|INTEGER|REAL}
    runtime_body

 說明:參數可以有多個,也可以沒有參數必須有且只有一個返回值

創建函數
示例:無參UDF

CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!”;
查看函數列表:
SHOW FUNCTION STATUS;
查看函數定義
SHOW CREATE FUNCTION function_name
刪除UDF:
DROP FUNCTION function_name
調用自定義函數語法:
SELECT function_name(parameter_value,...)

示例:有參數UDF

DELIMITER //
CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS
VARCHAR(20)
BEGIN
DELETE FROM students WHERE stuid = uid;
RETURN (SELECT COUNT(stuid) FROM students);
END//
DELIMITER ;

自定義函數中定義局部變量語法
DECLARE 變量1[,變量2,... ]變量類型 [DEFAULT 默認值]
 說明:局部變量的作用范圍是在BEGIN...END程序中,而且定義局部變量語句必須在BEGIN...END的第一行定義
 示例:

DELIMITER //
CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT
UNSIGNED)
RETURNS SMALLINT
BEGIN
DECLARE a, b SMALLINT UNSIGNED;
SET a = x, b = y;
RETURN a+b;
END//
DELIMITER ;

為變量賦值語法
SET parameter_name = value[,parameter_name = value...
SELECT INTO parameter_name
示例:

...
DECLARE x int;
SELECT COUNT(id) FROM tdb_name INTO x;
RETURN x;
END//

三、存儲過程

存儲過程優勢

存儲過程把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要時從數據庫中直接調用,省去了編譯的過程提高了運行速度,同時降低網絡數據傳輸量
存儲過程與自定義函數的區別
存儲過程實現的過程要復雜一些,而函數的針對性較強
存儲過程可以有多個返回值,而自定義函數只有一個返回值
存儲過程一般獨立的來執行,而函數往往是作為其他SQL語句的一部分來使用

存儲過程:存儲過程保存在mysql.proc表中
創建存儲過程

CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
routime_body 
proc_parameter : [IN|OUT|INOUT] parameter_name type

其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型
查看存儲過程列表

SHOW PROCEDURE STATUS;

查看存儲過程定義

SHOW CREATE PROCEDURE sp_name

調用存儲過程

CALL sp_name ([ proc_parameter [,proc_parameter ...]])
CALL sp_name

說明:當無參時,可以省略"()",當有參數時,不可省略"()”
存儲過程修改

ALTER語句修改存儲過程只能修改存儲過程的注釋等無關緊要的東西,不能修改
存儲過程體,所以要修改存儲過程,方法就是刪除重建

刪除存儲過程

DROP PROCEDURE [IF EXISTS] sp_name

存儲過程示例:
創建無參存儲過程

delimiter //
CREATE PROCEDURE showTime()
BEGIN
SELECT now();
END//
delimiter ;
CALL showTime;

創建含參存儲過程:只有一個IN參數

delimiter //
CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
BEGIN
SELECT * FROM students WHERE stuid = uid;
END//
delimiter ;
call selectById(2);

示例:

delimiter //
CREATE PROCEDURE dorepeat(n INT)
BEGIN
SET @i = 0;
SET @sum = 0;
REPEAT SET @sum = @sum+@i; SET @i = @i + 1;
UNTIL @i > n END REPEAT;
END//
delimiter ;
CALL dorepeat(100);
SELECT @sum;

創建含參存儲過程:包含IN參數和OUT參數:

delimiter //
CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num
SMALLINT UNSIGNED)
BEGIN
DELETE FROM students WHERE stuid >= uid;
SELECT row_count() into num;
END//
delimiter ;
call deleteById(2,@Line);
SELECT @Line;

說明:創建存儲過程deleteById,包含一個IN參數和一個OUT參數.調用時,傳入刪除的ID和保存被修改的行數值的用戶變量@Line,select @Line;輸出被影響行數。

四、觸發器

觸發器的執行不是由程序調用,也不是由手工啟動,而是由事件來觸發、激活從而實現執行
創建觸發器

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body

說明:

trigger_name:觸發器的名稱
trigger_time:{ BEFORE | AFTER },表示在事件之前或之后觸發
trigger_event::{ INSERT |UPDATE | DELETE },觸發的具體事件
tbl_name:該觸發器作用在表名

示例:

CREATE TABLE student_info (
stu_id INT(11) NOT NULL AUTO_INCREMENT,
stu_name VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (stu_id)
);
CREATE TABLE student_count (
student_count INT(11) DEFAULT 0
);
INSERT INTO student_count VALUES(0);

示例:創建觸發器,在向學生表INSERT數據時,學生數增加,DELETE學生時,學生數減少

CREATE TRIGGER trigger_student_count_insert
AFTER INSERT
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count+1;
CREATE TRIGGER trigger_student_count_delete
AFTER DELETE
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count-1;

查看觸發器

SHOW TRIGGERS

查詢系統表information_schema.triggers的方式指定查詢條件,查看指定的觸發器信息。

mysql> USE information_schema;
Database changed
mysql> SELECT * FROM triggers WHERE
trigger_name='trigger_student_count_insert';

刪除觸發器

DROP TRIGGER trigger_name;

五、MySQL用戶和權限管理

1、元數據數據庫:mysql
 系統授權表:

db, host, user
columns_priv, tables_priv, procs_priv, proxies_priv

用戶賬號:

'USERNAME'@'HOST'    允許用戶通過哪些主機遠程連接mysqld 服務
@'HOST':
主機名
IP地址或Network
通配符: % _
示例:172.16.%.%

2、用戶管理

創建用戶:CREATE USER
示例:

create  user  test@'192.168.34.%'  identified  by 'centos';添加test賬號在192.168.34這個網段,可以輸centos密碼連接
select user,host from user; 在創建新數據庫上查詢哪些host主機登陸了當前的mysql數據庫。

默認權限:USAGE
用戶重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;
刪除用戶:
DROP USER 'USERNAME'@'HOST‘

示例:

drop  user ''@'localhost'; 刪除空的匿名用戶
drop user ''@'centos7-1'; 空值部分要加單引號。

示例:刪除默認的空用戶
DROP USER ''@'localhost';

(1)創建用戶:

create  user  test@'192.168.34.%'  identified  by 'centos';

(2)在另一台主機上登陸mysql數據庫:

mysql -utest -pcentos  -h192.168.34.102;(IP地址是要遠程連接到主機的IP地址)

 (3)查詢當前登陸到mysql的賬號信息:

      select  user,host from user;

 (4)刪除空的匿名用戶賬號:

     drop  user ''@'localhost'; 刪除空的匿名用戶

     drop user ''@'centos7-1'; 空值部分要加單引號。

修改密碼:

SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');

 示例:

1、set password for test@'192.168.34.%'=password('biubiu'); 此方法立即生效
2、UPDATE mysql.user SET password=PASSWORD('password')
 WHERE clause;
此方法需要執行下面指令才能生效:
FLUSH PRIVILEGES;

 #mysqladmin -u root -poldpass password ‘newpass’ 也可以改口令。
忘記管理員密碼的解決辦法:

1、啟動mysqld進程時,為其使用如下選項:
   skip-grant-tables 忽略授權表,取消數據庫的授權         skip-networking  數據庫沒有網絡功能,避免其他用戶連接不輸入口令連接。
2、使用UPDATE命令修改管理員密碼
3、關閉mysqld進程,移除上述兩個選項,重啟mysqld

 破解數據庫步驟:

(1)vim /etc/my.cnf  將mysql數據庫配置文件打開

vim /etc/my.cnf
[mysqld]
skip-grant-tables
skip-networking

(2)重啟mysql服務

systemctl restart mariadb

(3)更新數據庫密碼:

 update mysql.user  set  password=password('magedu')  where  user='root';

(4)再將之前寫入Mysql配置文件內容注釋掉:

[root@centos7~]#vim /etc/my.cnf

[mysqld]
#skip-grant-tables

(5)重啟Mysql服務

systemctl restart mariadb

(6)用修改后的密碼就可以登錄了

mysql  -pmagedu

3、權限類別:
    管理類
    程序類
    數據庫級別
    表級別
    字段級別

1、管理類:

CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS

2、程序類: FUNCTION、PROCEDURE、TRIGGER

CREATE
ALTER
DROP
EXCUTE

3、庫和表級別:DATABASE、TABLE

ALTER
CREATE
CREATE VIEW
DROP
INDEX
SHOW VIEW
GRANT OPTION:能將自己獲得的權限轉贈給其他用戶

4、數據操作

SELECT
INSERT
DELETE
UPDATE

5、字段級別

SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)

6、所有權限

ALL PRIVILEGES 或 ALL

4、授權和回收授權

授權:

參考:https://dev.mysql.com/doc/refman/5.7/en/grant.html
GRANT   priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];  授權並創建賬

(1) priv_type: ALL [PRIVILEGES] 授權類型:

    insert增,delete刪 , update改,select查,all所有權限

(2) db_name.tb_name: 對哪個數據庫的哪個表授權:

  *.*: 所有庫的所有表

  db_name.*: 指定庫的所有表

  db_name.tb_name: 指定庫的指定表

  db_name.routine_name :指定庫的存儲過程和函數、觸發器

示例:

grant  all on  hellodb.*  to  test2@'192.168.34.%' identified by 'centos'; 創建test2用戶,允許其在所有主機通過centos密碼登錄,對hellodb庫的所有表有所有權限

grant  select(name,age) on  hellodb.students  to  test3@'192.168.34.%' identified by 'centos'; 創建test3用戶,允許其在所有主機通過centos密碼登錄,對hellodb庫的name和age有查看權限。

show grants  for  test2@'192.168.34.%' \G  可以查看當前用戶的授權情況,\G換行顯示

回收授權:

REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host

示例: revoke   select on   *.*  from  test3@'192.168.34.%'; 收回test3的select 權限

revoke   delete  on   *.*  from  test3@'192.168.34.%';  收回test3  的delete 權限

查看指定用戶獲得的授權

Help SHOW GRANTS
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];

注意:

① MariaDB 服務進程啟動時會讀取mysql 庫中所有授權表至內存

② GRANT 或REVOKE 等執行權限操作會保存於系統表中,MariaDB 的服務進程通常會自動重讀授權表,使之生效

③ 對於不能夠或不能及時重讀授權表的命令,可手動讓MariaDB 的服務進程重讀授權表:

  mysql> FLUSH PRIVILEGES;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM