ChatGPT解决这个技术问题 Extra ChatGPT

在 MySQL 中创建新用户并授予其对一个数据库的完全访问权限

我想在 MySQL 中创建一个新用户并授予它对一个数据库的完全访问权限,例如 dbTest,我使用 create database dbTest; 之类的命令创建该数据库。执行此操作的 MySQL 命令是什么?


F
Flimm

试试这个来创建用户:

CREATE USER 'user'@'hostname';

试试这个让它访问数据库 dbTest

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

如果您在同一台机器上运行访问 MySQL 的代码/站点,则主机名将是 localhost。

现在,崩溃。

GRANT - 这是用于创建用户和授予数据库、表等权限的命令。

ALL PRIVILEGES - 这告诉它用户将拥有所有标准权限。但是,这不包括使用 GRANT 命令的权限。

dbtest.* - 这指示 MySQL 应用这些权限以在整个 dbtest 数据库中使用。您可以根据需要将 * 替换为特定的表名或存储例程。

TO 'user'@'hostname' - 'user' 是您正在创建的用户帐户的用户名。注意:您必须在其中包含单引号。 'hostname' 告诉 MySQL 用户可以从哪些主机连接。如果您只希望它来自同一台机器,请使用 localhost

IDENTIFIED BY 'password' - 正如您已经猜到的那样,这会设置该用户的密码。


如果您允许网络访问并希望从任何主机建立连接,您可以将“主机名”更改为“%”。例如,... TO 'dbuser'@'%' IDENTIFIED... '%' 是主机通配符。
在处理用户和表时不要忘记刷新权限! :-)
这对我有用: CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';授予 db_database1 上的所有权限。* 到 'user1'@'localhost' 由 'password' 识别;同花顺特权;
@DanMcGrath:如果用户已经存在并且有密码,IDENTIFIED BY 'password' 子句是强制性的吗?
在 MySQL 的未来版本中将删除使用 GRANT 创建新用户(在撰写本文时已弃用)。将来它必须通过两个调用来完成,CREATE USER 然后 GRANT。
k
kenorb

句法

要在 MySQL/MariaDB 5.7.6 及更高版本中创建用户,请使用 CREATE USER syntax

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

然后授予对数据库的所有访问权限(例如 my_db),使用 GRANT Syntax,例如

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

其中 ALL (priv_type) 可以替换为特定权限,例如 SELECTINSERTUPDATEALTER 等。

然后重新加载新分配的权限运行:

FLUSH PRIVILEGES;

执行

要运行上述命令,您需要运行 mysql 命令并在提示符中键入它们,然后通过 quit 命令或 Ctrl-D 注销。

要从 shell 运行,请使用 -e 参数(将 SELECT 1 替换为上述命令之一):

$ mysql -e "SELECT 1"

或从标准输入打印语句:

$ echo "FOO STATEMENT" | mysql

如果您在上面遇到 Access denied,请指定 -u(用于用户)和 -p(用于密码)参数,或者对于长期访问,请在 ~/.my.cnf 中设置您的凭据,例如

[client]
user=root
password=root

外壳集成

对于不熟悉 MySQL 语法的人,这里有一些方便的 shell 函数,它们很容易记住和使用(要使用它们,你需要加载下面包含的 shell 函数)。

这是示例:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

要使用上述命令,您需要将以下函数复制并粘贴到您的 rc 文件中(例如 .bash_profile)并重新加载您的 shell 或获取该文件。在这种情况下,只需键入 source .bash_profile

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

注意:如果您不想在 Bash 历史记录中留下痕迹(例如密码),请检查:How to prevent commands to show up in bash history?


您是否需要分别创建用户和授予权限?我发现 grant 命令似乎是创建用户本身,至少在 mysql.user 表中看起来是这样。
@CreativityKills 如果您按照上面的建议将密码添加到您的 ~/.my.cnf 中,它将使用密码。
在 shell 历史中留下密码的痕迹不是一个好主意
@dmirkitanov 您可以通过添加空格来防止这种情况,请参阅:How to prevent commands to show up in bash history?
如果您想为所有数据库的 GRANT ALL ON *.* TO 'new_user'@'localhost'; 授予权限,请使用此选项,不要忘记运行 FLUSH PRIVILEGES;
s
superluminary

创建用户并授予数据库的所有权限。

登录到 MySQL:

mysql -u root

现在创建并授予

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

匿名用户(仅用于本地测试)

或者,如果您只想授予对数据库的完全不受限制的访问权限(例如,在本地计算机上的测试实例上,您可以授予匿名用户访问权限,如下所示:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

意识到

这对于开发中的垃圾数据很好。不要对你关心的任何事情这样做。


您可以像这样创建一个匿名用户,但不要!没有充分的理由让用户拥有完全权限且没有密码,但如果有人访问您不应该访问的服务器,那么它很可能会毁了您一天/一年/一天/一天的工作/工作。为什么要让他们更容易做其他事情?
如果有人获得了对我的 macbook 的远程访问权限,我需要担心的不仅仅是我的开发数据库的内容。我应该重申一下,这仅用于本地测试,请勿使用真实数据执行此操作。
确切地说,除了要担心所有其他事情之外,也不必担心开发数据库的内容。您的开发数据库可能(可能会)包含实时数据库数据的片段(例如,用于复制错误),应尽一切努力确保安全。没有密码就不需要访问数据库。它甚至不节省时间。不值得潜在的麻烦。
也许。就我而言,这是垃圾数据,我将承担风险。
S
S.K. Venkat
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

忽略 -p 选项,如果 mysql 用户没有密码或者只是按“[Enter]”按钮绕过。用大括号括起来的字符串需要用实际值替换。


c
candiru

您可以使用 CREATE USER 语句创建新用户,并使用 GRANT 授予他们权限。


创建用户 'jeffrey'@'localhost' 由 'mypass' 识别;
P
Park JongBum

对我来说,这很有效。

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

在哪里

spowner : 用户名

1234 : spowner 的密码

测试:数据库“spowner”有权访问


C
Community

如果您想创建一个新用户,则以下命令将起作用,让他拥有对本地主机上特定数据库(不是 Mysql 中的所有数据库)的所有访问权限。

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这将向 localhost 上的该用户授予一个数据库 test_database(在您的情况下为 dbTest)的所有权限。

通过运行以下命令检查上述命令向该用户发出的权限。

SHOW GRANTS FOR 'user'@'localhost'

以防万一,如果您想限制用户只能访问一个表

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

第一行中的语法错误和错字,“PRIVILEGES ON 'test_datase'”不应该有引号,后面应该有“.*”,例如,test_datase.*,并且是一个错字,应该是“test_database ”。
d
dummyDev

如果省略 host 部分,则默认为通配符 %,允许所有主机。

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'