比较来自世界各地的卖家的域名和 IT 服务价格

MySQL 除了一个表之外,提供数据库的所有访问权限

我找不到合理的解决方案来实现以下内容:

我想拥有一个用户 ALL 数据库中的权限 /或具有相同方案的数据库系列/, 为了

除了

他们只有一张桌子 SELECT 特权。

实质上,我希望用户自由管理数据库,但无法更新特定表。

到目前为止,我试过,但不成功:

提供此数据库中的所有权限 /db_name.*/, 然后特别提供特权 select 在这个所需的表格中 /希望它会重新启动 "all", 我知道愚蠢/.

提供此数据库的所有访问权限 /db_name.*/, 然后取消 insert, update 和 delete. 但这导致了一个错误,说没有拨款规则 db_name.table_name.

从我设法收集的内容,我必须单独为每个数据库表提供所有权限,除了读取表。

请有人告诉我有更简单的方式

笔记

: 我正在奔跑 MySQL 5.1. 最新版本可用 Ubuntu 10.04.
已邀请:

冰洋

赞同来自:

我知道这是一篇老帖子,但我以为我会加入 @tdammers 问题是其他人可以看到它。 你也可以表演 SELECT CONCAT 在 information_schema.tables, 创建你的团队 grant, 而且您无需编写一个单独的脚本。

首先取消此数据库的所有权限:


REVOKE ALL PRIVILEGES ON db.* FROM user@localhost;


然后创建自己的运营商 GRANT:


SELECT CONCAT/"GRANT UPDATE ON db.", table_name, " TO user@localhost;"/
FROM information_schema.TABLES
WHERE table_schema = "YourDB" AND table_name <> "table_to_skip";


复制并粘贴客户端的结果。 MySQL 并启动它们。

奔跑吧少年

赞同来自:

AFAIK,是的,您需要为每个表单独提供。 但是,嘿,那里有一台电脑。 计算机完全应对重复任务的自动化,因此您为什么不做以下的脚本:

获取数据库中所有表的列表 /
SHOW TABLES;

/

对于列表中的每个项目,请提供所有权限。

撤回特殊表格的许可

或者,作为一种选择:
2. 对于列表中的每个项目,检查它是一个特殊表; 如果这

不是

所以,授予所有许可证

我不给出代码的原因是它可以在任何脚本语言上完成 MySQL 意思是,偶数 shell 脚本; 使用您最方便的内容。

二哥

赞同来自:

这是我用来授予角色的草案 MariaDB.
也许安装 EVENT 让它变得更加尖锐 :-/


DELIMITER $$

DROP PROCEDURE IF EXISTS refreshRoles $$
CREATE PROCEDURE refreshRoles //
COMMENT 'Grant SELECT on new databases/tables, revoke on deleted'
BEGIN
DECLARE done BOOL;
DECLARE db VARCHAR/128/;
DECLARE tb VARCHAR/128/;
DECLARE rl VARCHAR/128/;
DECLARE tables CURSOR FOR
SELECT table_schema, table_name, '_bob_live_sg' FROM information_schema.tables
WHERE table_schema LIKE '%bob\_live\_sg' AND
/ false
OR table_name LIKE 'bundle%'
OR table_name LIKE 'cart%'
OR table_name LIKE 'catalog%'
OR table_name LIKE 'url%'
/;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=true;

CREATE ROLE IF NOT EXISTS '_bob_live_sg';
REVOKE ALL, GRANT OPTION FROM '_bob_live_sg';

OPEN tables;
SET done = false;
grant_loop: LOOP
FETCH tables INTO db, tb, rl;
IF done THEN
LEAVE grant_loop;
END IF;
SET @g = CONCAT/'GRANT SELECT ON `', db, '`.`', tb, '` TO ', rl/;
PREPARE g FROM @g;
EXECUTE g;
DEALLOCATE PREPARE g;
END LOOP;
CLOSE tables;
END $$

DELIMITER ;

CALL refreshRoles;

小姐请别说爱

赞同来自:

不幸的是,在 MySQL 有内置的自然方式来执行选择性 / 特殊任务。

您可以使用以下脚本 /linux console bash script/


#!/bin/bash

# Define the database and root authorization details
db_host='localhost'
db_name='adhoctuts'
db_user='root'
db_pass='Adhoctuts2018#'

# Define the query to get the needed tables
table_list=$/mysql -h $db_host -u $db_user -p"$db_pass" -se "select concat/table_schema,'.',table_name/ from information_schema.tables where table_schema='$db_name' and table_name not like 'tbl1' AND table_name not like '\_\_%';" $db_name | cut -f1/

# Convert the query result into the array
table_arr=/${table_list//,/ }/

# Declare the associative array of the users as username=>password pair
# e.g: declare -A user_list=/["'user1'"]="pass1" ["'user2'"]="pass2"/
# In our case there is a single user
declare -A user_list=/["'aht_r'@'localhost'"]="Adhoctuts2018#"/
for user in "${!user_list[@]}"
do
pass=${user_list[$user]}
# Recreate user
mysql -h $db_host -u $db_user -p"$db_pass" -se "drop user if exists $user; create user $user identified by '$pass';"

# Provide SELECT privilege
mysql -h $db_host -u $db_user -p"$db_pass" -se "revoke all privileges, grant option from $user;" $db_name
mysql -h $db_host -u $db_user -p"$db_pass" -se "grant usage on $db_name.* TO $user;" $db_name
for tbl in "${table_arr[@]}"; do
echo "grant select on $tbl TO $user"
mysql -h $db_host -u $db_user -p"$db_pass" -se "grant select on $tbl TO $user;" $db_name
done
done


如果你有一个控制台 windows, 您可以使用以下文件。 .bat:


@ECHO OFF
%= Define the database and root authorization details =%
set db_host=192.168.70.138
set db_name=adhoctuts
set db_user=adhoctuts
set db_pass=Adhoctuts2018#

mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "select concat/table_schema,'.',table_name/ from information_schema.tables where table_schema='%db_name%' and table_name not like 'tbl1' AND table_name not like '\_\_%%';" %db_name% > tbls

setlocal EnableDelayedExpansion
set user_cnt=2
set user[1]='Adhoctuts1'@'192.168.%%.%%'
set pass[1]=Adhoctuts1_2018#
set user[2]='Adhoctuts2'@'192.168.%%.%%'
set pass[2]=Adhoctuts2_2018#

set i=1
:loop
set user=!user[%i%]!
set pass=!pass[%i%]!
mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "drop user if exists %user% ; create user %user% identified by '%pass%';"
mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "revoke all privileges, grant option from %user%;" %db_name%
for /F "usebackq delims=" %%a in /"tbls"/ do /
mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "grant select on %%a TO %user%;" %db_name%
/
if %i% equ %user_cnt% goto :end_loop
set /a i=%i%+1
goto loop

:end_loop
del /f tbls


首先,编写查询以获取必要的表列表,然后定义要提供访问的用户列表。 每次数据库结构更改时都需要执行脚本。 我创建了一个单独的简短教科书 MySQL 可选择的 / 特殊任务。

https://adhoctuts.com/mysql-se ... tore/
/

https://youtu.be/8fWQbtIISdc

要回复问题请先登录注册