programing

MySQL은 테이블 하나를 제외한 모든 권한을 데이터베이스에 부여합니다.

powerit 2023. 9. 5. 20:51
반응형

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, 네, 테이블마다 개별적으로 허가해주셔야 합니다.하지만, 저기에 컴퓨터가 있습니다.컴퓨터는 반복 작업을 자동화하는 데 유용하므로 다음 작업을 수행하는 스크립트를 만드는 것이 어떻습니까?

  1. 데이터베이스의 모든 테이블 목록을 가져옵니다.SHOW TABLES;)
  2. 목록의 각 항목에 대해 모든 권한 부여
  3. 특수 테이블에 대한 사용 권한 해지

또는 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/

https://youtu.be/8fWQbtIISdc

언급URL : https://stackoverflow.com/questions/6288554/mysql-grant-all-privileges-to-database-except-one-table

반응형