MySQL: 사용자가 존재하는지 확인한 후 삭제
MySQL 사용자가 존재하는지 확인하고 이를 기반으로 사용자를 삭제하는 표준 방법은 없습니다.이에 대한 해결 방법이 있습니까?
않고 할 수 있는 합니다.
를 들어 예를 들어.
DROP USER test@localhost; :
이 방법은 효과가 있었습니다.
GRANT USAGE ON *.* TO 'username'@'localhost';
DROP USER 'username'@'localhost';
사용자가 아직 존재하지 않는 경우 사용자를 생성하고(및 무해한 권한을 부여한 후) 어떤 방식으로든 해당 사용자를 삭제합니다.솔루션 검색은 이쪽:http://bugs.mysql.com/bug.php?id=19166
업데이트: @Hao는 추가를 권장합니다.IDENTIFIED BY
는 디세이블을 권장합니다.@disableb (코멘트)는 디세이블입니다.NO_AUTO_CREATE_USER
.
5.이므로 MySQL 5.7을 할 수 .DROP USER IF EXISTS test
상세정보 : http://dev.mysql.com/doc/refman/5.7/en/drop-user.html
Phyzome의 답변(가장 투표율이 높은 답변)은 grant 스테이트먼트 끝에 "identified by"를 입력하면 사용자가 자동으로 작성되는 것 같습니다.그러나 그렇지 않으면 사용자는 생성되지 않습니다.다음 코드는 나에게 유효합니다.
GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
DROP USER 'username'@'localhost';
이게 도움이 됐으면 좋겠다.
MySQL 포럼 중 하나에서 이에 대한 답을 찾았습니다.사용자를 삭제하는 절차를 사용해야 합니다.
여기서 사용자는 데이터베이스 이름 "test"와 "databaseName"입니다.
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ANSI';
USE databaseName
;
DROP PROCEDURE IF EXISTS databaseName
.drop_user_if_exists
;
DELIMITER $$
CREATE PROCEDURE databaseName
.drop_user_if_exists
()
BEGIN
DECLARE foo BIGINT DEFAULT 0 ;
SELECT COUNT(*)
INTO foo
FROM mysql
.user
WHERE User
= 'test' and Host
= 'localhost';
IF foo > 0 THEN
DROP USER 'test'@'localhost' ;
END IF;
END ;$$
DELIMITER ;
CALL databaseName
.drop_user_if_exists
() ;
DROP PROCEDURE IF EXISTS databaseName
.drop_users_if_exists
;
SET SQL_MODE=@OLD_SQL_MODE ;
CREATE USER 'test'@'localhost' IDENTIFIED BY 'a';
GRANT ALL PRIVILEGES ON databaseName.* TO 'test'@'localhost'
WITH GRANT OPTION
업데이트: MySQL 5.7 이후 사용 가능DROP USER IF EXISTS
진술.참고 자료: https://dev.mysql.com/doc/refman/5.7/en/drop-user.html
문::
DROP USER [IF EXISTS] user [, user] ...
::
DROP USER IF EXISTS 'jeffrey'@'localhost';
참고로 이전 버전의 MySQL에서는 이것이 더 나은 해결책입니다.!!!
.'tempuser'@'%'
CALL DropUserIfExistsAdvanced('tempuser', '%');
" " 라는 이름의 모든 'tempuser'
'tempuser'@'%'
,'tempuser'@'localhost'
★★★★★★★★★★★★★★★★★」'tempuser'@'192.168.1.101'
와 같이 합니다.CALL DropUserIfExistsAdvanced('tempuser', NULL);
"이러다"라는 이름의 모든 됩니다.tempuser
...!!!!!!!
.DropUserIfExistsAdvanced
:
DELIMITER $$
DROP PROCEDURE IF EXISTS `DropUserIfExistsAdvanced`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `DropUserIfExistsAdvanced`(
MyUserName VARCHAR(100)
, MyHostName VARCHAR(100)
)
BEGIN
DECLARE pDone INT DEFAULT 0;
DECLARE mUser VARCHAR(100);
DECLARE mHost VARCHAR(100);
DECLARE recUserCursor CURSOR FOR
SELECT `User`, `Host` FROM `mysql`.`user` WHERE `User` = MyUserName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET pDone = 1;
IF (MyHostName IS NOT NULL) THEN
-- 'username'@'hostname' exists
IF (EXISTS(SELECT NULL FROM `mysql`.`user` WHERE `User` = MyUserName AND `Host` = MyHostName)) THEN
SET @SQL = (SELECT mResult FROM (SELECT GROUP_CONCAT("DROP USER ", "'", MyUserName, "'@'", MyHostName, "'") AS mResult) AS Q LIMIT 1);
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
ELSE
-- check whether MyUserName exists (MyUserName@'%' , MyUserName@'localhost' etc)
OPEN recUserCursor;
REPEAT
FETCH recUserCursor INTO mUser, mHost;
IF NOT pDone THEN
SET @SQL = (SELECT mResult FROM (SELECT GROUP_CONCAT("DROP USER ", "'", mUser, "'@'", mHost, "'") AS mResult) AS Q LIMIT 1);
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
UNTIL pDone END REPEAT;
END IF;
FLUSH PRIVILEGES;
END$$
DELIMITER ;
사용방법:
CALL DropUserIfExistsAdvanced('tempuser', '%');
를 'tempuser'@'%'
CALL DropUserIfExistsAdvanced('tempuser', '192.168.1.101');
를 'tempuser'@'192.168.1.101'
CALL DropUserIfExistsAdvanced('tempuser', NULL);
합니다.'tempuser'
를 들어 (를 들어)'tempuser'@'%'
,'tempuser'@'localhost'
★★★★★★★★★★★★★★★★★」'tempuser'@'192.168.1.101'
)
왜 이렇게 복잡한 일들과 속임수를 쓰죠?
DROP USER를 사용하는 것이 아니라...mysql.user 테이블에서 사용자를 삭제하고(사용자가 존재하지 않는 경우 오류가 발생하지 않음) 권한을 플러시하여 변경을 적용할 수 있습니다.
DELETE FROM mysql.user WHERE User = 'SomeUser' AND Host = 'localhost';
FLUSH PRIVILEGES;
-- 갱신 --
잘못했습니다.사용자를 그렇게 삭제하는 것은 안전하지 않습니다.DROP USER를 사용해야 합니다.mysql 옵션을 grants(사용하는 옵션)를 통해 자동으로 사용자를 생성하지 않도록 설정할 수 있기 때문에 그 트릭은 권장하지 않습니다.다음은 저에게 적합한 저장 프로시저의 스니펫입니다.
DECLARE userCount INT DEFAULT 0;
SELECT COUNT(*) INTO userCount FROM mysql.user WHERE User = userName AND Host='localhost';
IF userCount > 0 THEN
SET @S=CONCAT("DROP USER ", userName, "@localhost" );
PREPARE stmt FROM @S;
EXECUTE stmt;
SELECT CONCAT("DROPPED PRE-EXISTING USER: ", userName, "@localhost" ) as info;
END IF;
FLUSH PRIVILEGES;
DROP USER IF EXISTS 'user'@'localhost' ;
Maria DB에서 오류를 발생시키지 않고 사용할 수 있습니다.당신도 마찬가지입니다.
@Cherian의 답변에 대해 다음 행을 삭제할 수 있습니다.
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ANSI';
...
SET SQL_MODE=@OLD_SQL_MODE;
...
이것은 5.1.23보다 전의 버그입니다.이 버전 이후로는 이러한 기능은 더 이상 필요하지 않습니다.따라서 복사/붙여넣기 편의를 위해 위의 행을 삭제한 경우에도 마찬가지입니다.예를 들어 "test"는 사용자, "databaseName"은 데이터베이스입니다.이것은 이 버그에 의한 것입니다.
DROP PROCEDURE IF EXISTS databaseName.drop_user_if_exists ;
DELIMITER $$
CREATE PROCEDURE databaseName.drop_user_if_exists()
BEGIN
DECLARE foo BIGINT DEFAULT 0 ;
SELECT COUNT(*)
INTO foo
FROM mysql.user
WHERE User = 'test' and Host = 'localhost';
IF foo > 0 THEN
DROP USER 'test'@'localhost' ;
END IF;
END ;$$
DELIMITER ;
CALL databaseName.drop_user_if_exists() ;
DROP PROCEDURE IF EXISTS databaseName.drop_users_if_exists ;
CREATE USER 'test'@'localhost' IDENTIFIED BY 'a';
GRANT ALL PRIVILEGES ON databaseName.* TO 'test'@'localhost'
WITH GRANT OPTION
나는 체리안의 대답에 영감을 받아 이 절차를 썼다.차이점은 내 버전에서는 사용자 이름이 프로시저의 인수(하드코드화되지 않음)라는 것입니다.또한 사용자를 드롭한 후 매우 필요한 FLUSH PRIVALGES를 실행하고 있습니다.
DROP PROCEDURE IF EXISTS DropUserIfExists;
DELIMITER $$
CREATE PROCEDURE DropUserIfExists(MyUserName VARCHAR(100))
BEGIN
DECLARE foo BIGINT DEFAULT 0 ;
SELECT COUNT(*)
INTO foo
FROM mysql.user
WHERE User = MyUserName ;
IF foo > 0 THEN
SET @A = (SELECT Result FROM (SELECT GROUP_CONCAT("DROP USER"," ",MyUserName,"@'%'") AS Result) AS Q LIMIT 1);
PREPARE STMT FROM @A;
EXECUTE STMT;
FLUSH PRIVILEGES;
END IF;
END ;$$
DELIMITER ;
이 코드를 Code Review 웹사이트(https://codereview.stackexchange.com/questions/15716/mysql-drop-user-if-exists)에도 올렸습니다.
DROP USER 'user'@'localhost';
위의 명령어는 사용자를 데이터베이스에서 삭제하지만 동일한 사용자가 이미 데이터베이스를 사용하고 있는 경우 해당 세션을 종료할 때까지 세션이 종료되지 않음을 확인하는 것이 중요합니다.드롭된 사용자는 여전히 데이터베이스에 액세스하여 모든 작업을 수행합니다.사용자를 삭제해도 현재 사용자 세션은 삭제되지 않습니다.
phyzome의 답변(즉시 동작하지 않음)과 안드레브의 코멘트(즉시 동작하지 않음)를 조합한 결과, 액티브한 경우 일시적으로 NO_AUTO_CREATE_USER 모드를 무효로 하는 것처럼 보이는 코드가 나왔습니다.
set @mode = @@SESSION.sql_mode;
set session sql_mode = replace(replace(@mode, 'NO_AUTO_CREATE_USER', ''), ',,', ',');
grant usage on *.* to 'myuser'@'%';
set session sql_mode = @mode;
drop user 'myuser'@'%';
terminal do:
sudo mysql -u root -p
비밀번호를 입력합니다.
select user from mysql.user;
이제 사용자 'the_timeout'을 삭제합니다.
DROP USER the_unername;
삭제할 사용자로 'the_module'을 바꿉니다.
학생들이 많이 일하는 학교 서버가 있는 경우.다음 방법으로 난장판을 정리할 수 있습니다.
delete from user where User != 'root' and User != 'admin';
delete from db where User != 'root' and User != 'admin';
delete from tables_priv;
delete from columns_priv;
flush privileges;
테이블에서 드롭이 존재하는 경우 드롭을 삭제할 경우DELETE
예를 들어 다음과 같습니다.
DELETE FROM users WHERE user_login = 'foobar'
일치하는 행이 없으면 오류가 아닙니다.
언급URL : https://stackoverflow.com/questions/598190/mysql-check-if-the-user-exists-and-drop-it
'programing' 카테고리의 다른 글
MYSQL_ROOT_PASSWORD 환경변수가 mariadb 컨테이너에 설정되어 있지 않다. (0) | 2022.09.19 |
---|---|
Python: 목록에서 요소 찾기 (0) | 2022.09.19 |
Vuetify 탐색 드로어 v-modeled to Vuex (0) | 2022.09.19 |
MySQL에서 데이터베이스를 드롭하면 "Error droping database errno: 66"이 반환됩니다. (0) | 2022.09.19 |
Vue 2 목록에 새 항목 추가 (0) | 2022.09.19 |