programing

현재 사용자가 MySQL/MariaDB에 대한 특정 권한을 가지고 있는지 확인하려면 어떻게 해야 합니까?

randomtip 2022. 11. 2. 23:00
반응형

현재 사용자가 MySQL/MariaDB에 대한 특정 권한을 가지고 있는지 확인하려면 어떻게 해야 합니까?

현재 사용자에게 특정 권한이 있는지 여부를 쉽게 확인할 수 있는 방법(예: 다음 명령어를 실행할 수 있는지 여부)

INSERT INTO testdb (id) VALUES ('1');

물론 시도해 볼 수는 있지만 어떤 것을 넣어야 할지 알기 전에 정보가 필요합니다.DELETE 권한이 없기 때문에 아무것도 넣지 않습니다.사용.SHOW GRANTS;매우 복잡하기 때문에 충분하지 않습니다.예를 들어, 직접, 역할을 통해서, 호스트에게만, 여러가지 특권을 가질 수 있기 때문입니다.

제 특권을 확인할 수 있는 더 쉬운 방법은 없나요?

정말 감사합니다!

를 사용할 수 있습니다.INFORMATION_SCHEMA실행할 필요가 있는 액션을 기반으로 필요한 권한을 쿼리합니다.

SELECT IF(COUNT(*) > 0, TRUE, FALSE) AS Allowed
FROM INFORMATION_SCHEMA.USER_PRIVILEGES
WHERE GRANTEE LIKE '%user%' AND PRIVILEGE_TYPE = 'INSERT'

코멘트에 기재되어 있는 시작/롤백 방식은 비용이 많이 들고 트랜잭션 이외의 스토리지 엔진에서는 사용할 수 없습니다.

MariaDB와 MySQL은 모두 사용자가 실행하지 않는 준비된 스테이트먼트를 제공합니다.준비 중에 서버는 이미 권한을 확인하고 오류를 반환합니다.

C의 예:

const char *stmt_str= "INSERT INTO t2 VALUES (?)";
if (mysql_stmt_prepare(stmt, stmt_str, strlen(stmt_str))
{
  printf("Error: %s\n", mysql_stmt_error(stmt));
}

SQL의 예:

mysql> prepare my from "insert into t2 values (?)";
ERROR 1142 (42000): INSERT command denied to user 'foo'@'localhost' for table 't2'

그러나 이 솔루션은 일부 SQL 문을 준비할 수 없기 때문에 제한적입니다.허용된 스테이트먼트 목록은 MariaDB Documentation에서 확인할 수 있습니다.

prepare 명령어가 성공했을 경우, 준비된 스테이트먼트를 해방하는 것을 잊지 말아 주세요.

SELECT, INSERT, UPDATE, DELETE 권한만 선택하면 권한을 확인하는 EXPLINE 명령을 사용할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/58012006/how-can-i-check-if-current-user-has-certain-privilege-on-mysql-mariadb

반응형