MySQL은 테이블 하나를 제외한 모든 권한을 데이터베이스에 부여합니다.
다음을 달성할 수 있는 합리적인 솔루션을 찾지 못했습니다.
SELECT 권한만 갖는 테이블 하나를 제외하고 데이터베이스(또는 동일한 스키마를 가진 일련의 데이터베이스)에 대한 모든 권한을 가진 사용자를 원합니다.
기본적으로 사용자가 데이터베이스를 자유롭게 관리할 수 있지만 특정 테이블을 업데이트할 수는 없습니다.
지금까지 노력했지만 소용이 없었습니다.
해당 데이터베이스(db_name)에 대한 모든 권한을 부여합니다.*) 그런 다음 원하는 테이블에 대한 선택 권한만 부여합니다("모두", 내가 아는 바보 같은 것을 덮어쓰길 바랍니다).
해당 데이터베이스(db_name)에 대한 모든 권한을 부여합니다.*) 그런 다음 삽입, 업데이트 및 삭제를 취소합니다.그러나 db_name.table_name에 대한 허가 규칙이 없다는 오류가 발생했습니다.
제가 수집한 바로는 읽기 전용 테이블을 제외한 데이터베이스의 각 테이블에 대한 모든 권한을 개별적으로 부여해야 합니다.
누가 좀 더 쉬운 방법이 있다고 말해주세요.
참고: MySQL 5.1을 실행하고 있습니다.Ubuntu 10.04에서 사용할 수 있는 최신 버전입니다.
저는 이것이 오래된 게시물이라는 것을 알지만, 저는 다른 사람들이 볼 수 있도록 @tdamers 질문에 추가하고 싶다고 생각했습니다.또한 information_schema.tables에서 SELECT CONCAT를 수행하여 grant 명령을 생성할 수 있으며 별도의 스크립트를 작성할 필요가 없습니다.
먼저 해당 DB에서 모든 권한을 해지합니다.
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 기능, 심지어 셸 스크립트를 통해 어떤 스크립트 언어로도 가능하기 때문입니다. 가장 사용하기 편한 것을 사용하십시오.
여기 제가 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에는 선택적/예외적 작업을 수행할 수 있는 자연스러운 방식이 기본으로 포함되어 있습니다.
아래 스크립트(리눅스 콘솔 bash 스크립트)를 사용할 수 있습니다.
#!/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
윈도우즈 콘솔이 있는 경우 다음 .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-selective-exceptional-permissions-and-backup-restore/
언급URL : https://stackoverflow.com/questions/6288554/mysql-grant-all-privileges-to-database-except-one-table
'programing' 카테고리의 다른 글
Android에서 활동 제목을 변경하는 방법은 무엇입니까? (0) | 2023.09.05 |
---|---|
powershell을 사용하여 인증서 개인 키의 사용자에게 권한을 부여하는 방법은 무엇입니까? (0) | 2023.09.05 |
오류 가져오기 "양식이 연결되지 않아 양식 제출이 취소되었습니다." (0) | 2023.09.05 |
정렬된 배열에서 O(n) 시간에 홀수 번 발생하는 숫자를 어떻게 찾을 수 있습니까? (0) | 2023.09.05 |
MariaDB 10.2 mysql_install_db가 중단됨 (0) | 2023.09.05 |