почему MySQL не нравится пользователю 'a' @ 'b', когда я просто удалил их из mysql.user? - PullRequest
2 голосов
/ 10 сентября 2010

Это то, что я сделал.

mysql> CREATE USER 'matrix'@'%.something.com' IDENTIFIED BY 'weak';
ERROR 1396 (HY000): Operation CREATE USER failed for 'matrix'@'%.something.com'
mysql> CREATE USER 'foo'@'%.something.com' IDENTIFIED BY 'weak';
Query OK, 0 rows affected (0.00 sec)

И вот что я получаю в итоге:

mysql> select user,host from mysql.user;
+------------------+--------------------+
| user             | host               |
+------------------+--------------------+
| auth             | %.something.com    |
| foo              | %.something.com    |
| submit           | %.something.com    |
| testcase         | %.something.com    |
| version          | %.something.com    |
| root             | 127.0.0.1          |
| root             | this.something.com |
| debian-sys-maint | localhost          |
| master           | localhost          |
| root             | localhost          |
+------------------+--------------------+
10 rows in set (0.00 sec)

Кажется, проблема в том, что я удалил пользователей через DELETE FROM mysql.user WHERE User IN (%s);, чтобы обойти проблему, которую я не знаю, существуют ли учетные записи.

Мое (безобразное) решение, замените DELETE FROM mysql.user WHERE... на:

DELIMITER //
CREATE PROCEDURE dropuserif(u VARCHAR(32), h VARCHAR(64))
BEGIN
  DECLARE s INT;
  SELECT COUNT(*) INTO s FROM mysql.user WHERE user = u AND host = h;
  IF s > 0 THEN
    BEGIN
      SET @d = CONCAT("DROP USER '", u, "'@'", h, "';");
      PREPARE stmt_name FROM @d;
      EXECUTE stmt_name;
      DEALLOCATE PREPARE stmt_name;
    END;
  END IF;
END//
DELIMITER ;

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

Поиском по сети "ошибка 1396" обнаруживается этот отчет об ошибке .

Причина, по-видимому, заключается в том, что ранее удаленные пользовательские записи все еще каким-то образом скрыты в базе данных и блокируют создание новых учетных записей с тем же именем.

Попробуйте FLUSH PRIVILEGES; перед первым оператором и запустите их снова.

0 голосов
/ 10 сентября 2010

посмотрите здесь для хорошего начала в этом вопросе

[snark] Есть причина, по которой вы не просто искали 'mysql ERROR 1396'?[/ Снарк]

...