如何创建MariaDB用户帐户并授予权限

时间:2020-03-05 15:24:55  来源:igfitidea点击:

MariaDB是一个开源MySQL项目,功能更加改进。
它与MySQL高度兼容,它可以被视为对MySQL的替代品。
所有客户端库,客户端 - 服务器协议,SQL语言,MySQL复制,主从配置等与MySQL非常相似。

在本教程中,我将解释一些基本的MariaDB命令,如创建用户,在MariaDB中创建一个数据库。
这包括用于数据操纵,存储和其他事务的命令的重要列表。

1)创建新的MariaDB用户帐户

此语句创建新的MariaDB帐户。
要使用此命令,我们必须具有全局创建用户权限或者MySQL数据库的Insert Privilege。
对于每个帐户,创建用户在mysql.user表中创建一个新的行,该表没有权限。

该帐户可以给出一个密码,其中包含可选的标识。
要在纯文本中指定密码,可以省略密码关键字。
要将密码指定为密码函数返回的哈希值,请包括密码关键字。

如果未使用标识的by子句指定密码,则用户将能够在没有密码的情况下连接。
空白密码不是通配符以匹配任何密码。
如果未设置密码,则用户必须连接而不提供密码。

Syntax :
CREATE [OR REPLACE] USER [IF NOT EXISTS]
user_specification [,user_specification] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
user_specification:
user
[
IDENTIFIED BY [PASSWORD] 'password'
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
]
ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count

要使用授权,我们必须具有授权选项权限,并且我们必须拥有我们授予的权限。
让我们看看如何使用纯密码添加用户,并为此分配了一些资源限制。

MariaDB [(none)]> create user saheadmin identified by 'password';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT USAGE ON *.* TO 'saheadmin'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
Query OK, 0 rows affected (0.00 sec)

2)授予权限

授权语句授予MySQL用户帐户的权限。
Grant还用于指定其他帐户特征,例如使用安全连接和限制对服务器资源的限制。
要使用授权,我们必须具有授权选项权限,并且我们必须拥有我们授予的权限。

通常,数据库管理员首先使用创建用户创建一个帐户,然后授予授予其权限和特征。
例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

Revoke语句与授权有关,并使管理员能够删除帐户权限。

从MySQL程序成功执行时,授予查询OK的响应,影响了0行。
要确定操作中是否产生了哪些特权,请使用显示授权。

有不同的权限级别可以使用授权选项设置。
请参阅以下详细信息:

特权可以全局设置,用于整个数据库,用于表格,或者表中的单个列。
某些特权只能设置在某些级别。

全局权限使用* for priv_level授予。
全局权限包括管理数据库和管理用户帐户的权限,以及所有表,函数和过程的权限。
全局权限存储在MySQL.User表中。

使用DB_NAME授予数据库权限。

  • for priv_level,或者仅使用*使用默认数据库。
    数据库权限包括创建表和函数的权限,以及数据库中的所有表,函数和过程的权限。
    数据库权限存储在mysql.db表中。

表权限是使用db_name.tbl_name for priv_level或者使用tbl_name授予的,以在默认数据库中指定表。
表关键字是可选的。
表权限包括在表中选择和更改数据的功能。
可以为单个列授予某些表权限。

通过为Priv_Level指定表并在权限类型之后提供列列表来授予列权限。
它们允许我们准确控制表格用户中哪个列可以选择和更改。

使用函数db_name.routine_name for priv_level或者仅使用function ratine_name授予函数权限,以指定默认数据库中的函数。

过程权限使用priv_level的步骤db_name.routine_name授予授权,或者使用步骤例程_name指定默认数据库中的过程。

我们可以使用示例获取此手册以获取更多选项。

3)删除用户

此语句删除了一个或者多个Mariadb帐户。
它删除了来自所有授予表的帐户的权限行。
要使用此语句,我们必须具有全局创建用户权限或者MySQL数据库的删除权限。
每个帐户使用与创建用户语句相同的格式命名。

MariaDB [mysql]> drop user saheadmin;
Query OK, 0 rows affected (0.00 sec)

4)重命名用户

这可用于重命名MariaDB帐户。

Syntax :
RENAME USER old_user TO new_user
[, old_user TO new_user] ...

我创造了两个用户,即Vicky A&Sara并将其重命名为Vik和Sarah。
修改后,我们可以在MySQL用户表中确认其状态。

MariaDB [mysql]> rename user 'vicky' to 'vik'@'localhost', 'sara' to 'sarah'@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> use mysql; select * from user;

5)设置密码

此语句将密码分配给现有MariaDB用户帐户。
可以使用password()或者old_password()函数指定密码。
我们可以在使用这些函数时提供密码的字面文本。
如果在不使用任一函数的情况下指定了密码,则密码应该是密码()返回的已被加密的密码值。
Old_Password()应该只用于非常旧的MySQL/Mariadb版本(<4.0.0)。

MariaDB [(none)]> set password for 'saheadmin'@'localhost' = Password('sahe123');
Query OK, 0 rows affected (0.00 sec)

密码()函数返回41字符串哈希。

6)创建角色

此语句用于创建一个或者多个MariaDB角色。
我们需要为此目的才能创建全局创建用户并插入权限。
在添加角色时,将新列添加到MySQL.USER表中,没有权限,并且将相应的IS_ROLE字段设置为Y.我们需要登录特权用户并运行此命令以创建首选角色。

Syntax :
CREATE [OR REPLACE] ROLE [IF NOT EXISTS] role
[WITH ADMIN
{CURRENT_USER | CURRENT_ROLE | user | role}]
MariaDB [(none)]> create role admin;
Query OK, 0 rows affected (0.00 sec)

使用管理选项:

带管理子句的可选确定当前用户/角色或者其他用户/角色是否具有新创建的角色。
默认情况下,它需要管理员current_user,这意味着当前用户将能够向用户授予此角色。

MariaDB [(none)]> create role sysadmin with admin saheadmin;
Query OK, 0 rows affected (0.01 sec)

7)下降作用

此语句用于从服务器中删除一个或者多个MariaDB角色。
它不会删除或者禁用具有设置角色使用的用户的先前分配的角色。
因此,如果随后重新创建并授予角色,它将再次使用它作为用户的默认值。
我们需要使用MySQL User.Table完全删除默认角色的记录,使用Set Role None。

MariaDB [(none)]> drop role supportadmin;
Query OK, 0 rows affected (0.01 sec)

8)设置角色

此语句使其具有当前会话的所有权限以及所有权限。
我为我的一个用户'saheadmin'创建了一个角色,并为该用户提供权限来管理角色。

root@theitroad-mariadb:~# mysql -u saheadmin -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 76
Server version: 10.0.27-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> set role sysadmin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select current_role;
+--------------+
| current_role |
+--------------+
| sysadmin |
+--------------+
1 row in set (0.00 sec)

要从整个服务器中删除特定的角色,我们需要使用drop角色'rolename'与set角色'none'一起使用。
这将明确地从服务器中删除角色。

MariaDB [(none)]> set role none;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select current_role;
+--------------+
| current_role |
+--------------+
| NULL |
+--------------+

9)显示授权

此语句列出了添加到用户/角色的授权语句或者权限。

MariaDB [(none)]> show grants for 'saheadmin'@'localhost';
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for saheadmin@localhost |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'saheadmin'@'localhost' IDENTIFIED BY PASSWORD '*2DDFCC8B407A5C3798347782FC76BF0367586AD5' WITH MAX_QUERIES_PER_HOUR 90 |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> show grants for saheadmin;
+-----------------------------------------------------+
| Grants for saheadmin@% |
+-----------------------------------------------------+
| GRANT sysadmin TO 'saheadmin'@'%' WITH ADMIN OPTION |
| GRANT USAGE ON *.* TO 'saheadmin'@'%' |
+-----------------------------------------------------+
2 rows in set (0.00 sec)

它也可用于查看授予角色的权限。
这就是我们如何为角色查看授权权限。

MariaDB [(none)]> show grants for sysadmin;
+----------------------------------+
| Grants for sysadmin |
+----------------------------------+
| GRANT USAGE ON *.* TO 'sysadmin' |
+----------------------------------+
1 row in set (0.00 sec)

10)创建数据库

这将创建具有给定名称的数据库。
我们可以使用子句(如果存在/如果不存在这些命令)以在执行时将警告返回警告而不是错误。

MariaDB [(none)]> CREATE DATABASE docker;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS docker;
Query OK, 1 row affected, 1 warning (0.00 sec)
MariaDB [(none)]> show warnings;
+-------+------+-------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------+
| Note | 1007 | Can't create database 'docker'; database exists |
+-------+------+-------------------------------------------------+
1 row in set (0.00 sec)

11)删除数据库

这会删除数据库中的所有表并删除数据库。
删除数据库时,数据库上的用户权限不会自动删除。

MariaDB [(none)]> drop database docker;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> drop database docker;
ERROR 1008 (HY000): Can't drop database 'docker'; database doesn't exist

12)使用"使用"选择数据库

这用于为后续语句选择一个数据库。
在执行下一个使用语句之前,数据库保持相同。

Syntax USE db_name;
MariaDB [(none)]> use docker;
Database changed

13)创建表

它用于创建一个新表,我们可以其中存储数据库内的实际数据。

MariaDB [docker]> create table t1 (a int check(a>0) ,b int check (b> 0), constraint abc check (a>b));
Query OK, 0 rows affected (0.01 sec)

14)改变表

它使我们可以更改现有表的结构。
我们可以使用此命令修改现有表。
我们可以使用此添加/删除列,更改现有列或者重命名列或者表本身的类型。
它可以强迫MariaDB重新构建表格。
我们可以查看此示例,其中我们正在将表引擎从InnoDB更改为Myisam

MariaDB [docker]> show table status;
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| t1 | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 0 | NULL | 2015-10-31 06:49:41 | NULL | NULL | utf8mb4_general_ci | NULL | | |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
1 row in set (0.01 sec)
MariaDB [docker]> ALTER TABLE t1 ENGINE = MyISAM;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [docker]> show table status;
+------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| t1 | MyISAM | 10 | Fixed | 0 | 0 | 0 | 2533274790395903 | 1024 | 0 | NULL | 2015-10-31 08:23:25 | 2015-10-31 08:23:25 | NULL | utf8mb4_general_ci | NULL | | |
+------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
1 row in set (0.00 sec)

15)掉落表

删除一个或者多个表。
删除表时,表上的用户权限不会自动删除。

Syntax : drop table table_name;
MariaDB [docker]> drop table t2, t3;
Query OK, 0 rows affected (0.02 sec)

16)描述

它提供有关表中列的信息。
这将显示有关表的完整信息,包括在每列中输入的数据。
它是显示列的快捷方式。

Syntax:
{DESCRIBE | DESC} tbl_name [col_name | wild]
MariaDB [mydatabase]> desc mytable;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+--

17)插入

此语句将新行插入现有表中。
让我们创建一个名为"产品"的表,并将一些数据插入其中。

MariaDB [mydatabase]> CREATE TABLE IF NOT EXISTS products (
-> productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> productCode CHAR(3) NOT NULL DEFAULT '',
-> name VARCHAR(30) NOT NULL DEFAULT '',
-> quantity INT UNSIGNED NOT NULL DEFAULT 0,
-> price DECIMAL(7,2) NOT NULL DEFAULT 99999.99,
-> PRIMARY KEY (productID)
-> );
Query OK, 0 rows affected (0.01 sec)

首先,使用列值将数据插入第一行。

MariaDB [mydatabase]> INSERT INTO products VALUES (1001, 'PEN', 'Pen Red', 5000, 1.23);
Query OK, 1 row affected (0.00 sec)

我们可以在一个语句中插入多个行值,如下所示。

MariaDB [mydatabase]> INSERT INTO products VALUES
-> (NULL, 'PEN', 'Pen Blue', 8000, 1.25),
-> (NULL, 'PEN', 'Pen Black', 2000, 1.25);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

向Auto_increment列添加Null值将导致最大值+1.
我们甚至可以使用此将值插入特定列。
auto_increment列的缺失条目将自动为计数添加+1值。

MariaDB [mydatabase]> INSERT INTO products (productCode, name, quantity, price) VALUES
-> ('PEC', 'Pencil 2B', 10000, 0.48),
-> ('PEC', 'Pencil 2H', 8000, 0.49);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

在将值插入指定列的同时,将填充缺少条目的默认值。
查看上次产品的条目。

MariaDB [mydatabase]> INSERT INTO products (productCode, name) VALUES ('PEC', 'Pencil HB');
Query OK, 1 row affected (0.00 sec)

我们可以查看以下表格内容:

MariaDB [mydatabase]> SELECT * FROM products;
+-----------+-------------+-----------+----------+----------+
| productID | productCode | name | quantity | price |
+-----------+-------------+-----------+----------+----------+
| 1001 | PEN | Pen Red | 5000 | 1.23 |
| 1002 | PEN | Pen Blue | 8000 | 1.25 |
| 1003 | PEN | Pen Black | 2000 | 1.25 |
| 1004 | PEC | Pencil 2B | 10000 | 0.48 |
| 1005 | PEC | Pencil 2H | 8000 | 0.49 |
| 1006 | PEC | Pencil HB | 0 | 99999.99 |
+-----------+-------------+-----------+----------+----------+
6 rows in set (0.00 sec)
MariaDB [mydatabase]>

我们甚至可以使用以下语句删除不需要的行内容:

MariaDB [mydatabase]> delete from products where productID = 1006;
Query OK, 1 row affected (0.01 sec)
MariaDB [mydatabase]> SELECT * FROM products;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1001 | PEN | Pen Red | 5000 | 1.23 |
| 1002 | PEN | Pen Blue | 8000 | 1.25 |
| 1003 | PEN | Pen Black | 2000 | 1.25 |
| 1004 | PEC | Pencil 2B | 10000 | 0.48 |
| 1005 | PEC | Pencil 2H | 8000 | 0.49 |
+-----------+-------------+-----------+----------+-------+
5 rows in set (0.00 sec)

帮助命令

"帮助"命令可用于任何MariaDB客户端,以获取基本语法帮助以及大多数命令和函数的简短描述。
我们可以使用帮助内容来查看帮助类别列表。

MariaDB [mydatabase]> help contents;
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
Account Management
Administration
Compound Statements
Data Definition
Data Manipulation
Data Types
Functions
........
MariaDB [mydatabase]> help Account Management;
You asked for help about help category: "Account Management"
For more information, type 'help <item>', where <item> is one of the following
topics:
CREATE USER
DROP USER
GRANT
RENAME USER
REVOKE
SET PASSWORD

我们甚至可以寻求帮助搜索特定字符串,如创建或者授予。
它将提供有关该SQL命令使用情况的完整教程。

MariaDB [mydatabase]> help create;
Many help items for your request exist.
To make a more specific request, please type 'help <item>',
where <item> is one of the following
topics:
CREATE DATABASE
CREATE EVENT
CREATE FUNCTION
CREATE FUNCTION UDF
CREATE INDEX
CREATE PROCEDURE
CREATE SERVER
CREATE TABLE
.........
MariaDB [mydatabase]> help CREATE DATABASE;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...