Erro 1449 do MySQL: O usuário especificado como definidor não existe

353

Quando executo a seguinte consulta, recebo um erro:

SELECT
  `a`.`sl_id`                     AS `sl_id`,
  `a`.`quote_id`                  AS `quote_id`,
  `a`.`sl_date`                   AS `sl_date`,
  `a`.`sl_type`                   AS `sl_type`,
  `a`.`sl_status`                 AS `sl_status`,
  `b`.`client_id`                 AS `client_id`,
  `b`.`business`                  AS `business`,
  `b`.`affaire_type`              AS `affaire_type`,
  `b`.`quotation_date`            AS `quotation_date`,
  `b`.`total_sale_price_with_tax` AS `total_sale_price_with_tax`,
  `b`.`STATUS`                    AS `status`,
  `b`.`customer_name`             AS `customer_name`
FROM `tbl_supplier_list` `a`
  LEFT JOIN `view_quotes` `b`
    ON (`b`.`quote_id` = `a`.`quote_id`)
LIMIT 0, 30

A mensagem de erro é:

#1449 - The user specified as a definer ('web2vi'@'%') does not exist

Por que estou recebendo esse erro? Como faço para corrigir isso?

Tech MLG
fonte
7
Mostre-nos o seu SHOW CREATE VIEW 'view_quotes'
jordeu 16/04
O erro deve estar em que condições de view_quotesexibição.
Shell
Depois de pensar nisso por um momento, o curso de ação mais simples foi adicionar a conta ausente ao banco de dados e o erro desapareceu. Nenhum procedimento complicado é necessário. Se você pode adicionar a conta, tente isso primeiro.
user1794918

Respostas:

540

Isso geralmente ocorre ao exportar visualizações / gatilhos / procedimentos de um banco de dados ou servidor para outro, pois o usuário que criou esse objeto não existe mais.

Você tem duas opções:

1. Mude o DEFINADOR

Isso é possivelmente mais fácil ao importar inicialmente seus objetos de banco de dados, removendo quaisquer DEFINERinstruções do dump.

Alterar o definidor mais tarde é um pouco mais complicado:

Como alterar o definidor de visualizações

  1. Execute este SQL para gerar as instruções ALTER necessárias

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
    
  2. Copie e execute as instruções ALTER

Como alterar o definidor para procedimentos armazenados

Exemplo:

UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'

Cuidado, pois isso mudará todos os definidores para todos os bancos de dados.

2. Crie o usuário ausente

Se você encontrou o seguinte erro ao usar o banco de dados MySQL:

The user specified as a definer ('someuser'@'%') does not exist`

Em seguida, você pode resolvê-lo usando o seguinte:

GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password';
FLUSH PRIVILEGES;

From http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

Isso funcionou como um encanto - você só precisa mudar someuserpara o nome do usuário ausente. Em um servidor de desenvolvimento local, você normalmente pode apenas usar root.

Considere também se você realmente precisa conceder ALLpermissões ao usuário ou se elas poderiam fazer com menos.

Chococroc
fonte
11
. e opção de concessão não são necessárias.
helpse
@ Simon East: Você fez uma edição adorável, muito obrigado por melhorar muito a resposta.
Chococroc 16/03/19
Sugiro adicionar, reiniciar a instância do mySQL após executar a consulta "UPDATE mysql. procP SET definidor = 'usuário @%' WHERE definidor = 'raiz @%'" ", pois os definidores dos procedimentos são atualizados somente então.
Johan #
11
Eu acho que é mais fácil de adicionar usuários sem sentido, porque a próxima vez que você faz um dbdump e importá-lo, você não precisa fazer as views / procedimentos de edição de novo
DarkMukke
11
Obrigado, acabei de soltar a tabela com o problema, removi DEFINER=`user`@`host`e reimportei. Funcionou como um encanto. : ok_hand:
giovannipds
139

O usuário que criou originalmente a visualização ou procedimento SQL foi excluído. Se você recriar esse usuário, ele deverá solucionar o seu erro.

Dave Z Dopson
fonte
3
Além disso, você precisará conceder pelo menos os privilégios SELECTe EXECUTEao usuário adicionado. Encontrei isso ao exportar um backup de banco de dados de um servidor para outro, onde o usuário que criou as rotinas não existia no servidor de teste.
precisa saber é o seguinte
5
Obrigado, isso foi útil. Freqüentemente, ao migrar ou implementar usando o mysqldump, o usuário que criou o VIEW, TRIGGER ou PROCEDURE (o definidor) pode não ser o mesmo no sistema de destino. Nesse caso, apenas recriar o procedimento, disparar ou exibir ( DROPdepois re CREATE) usar um usuário válido no sistema de destino deve fazer o truque.
Eric Kigathi
38
você também pode alterar quem é o definidor para um usuário existente:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
11
Exatamente no meu caso, eu tinha uma tabela com gatilho que apontava para um usuário DEFINER que foi excluído. A atualização do usuário acionador resolveu o problema.
Miguel
Você também precisa dar permissão para que o usuário :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor
50

Eu recebi o mesmo erro depois de atualizar o mysql.

O erro foi corrigido após este comando:

mysql_upgrade -u root

O mysql_upgrade deve ser executado sempre que você atualizar o MySQL. Ele verifica todas as tabelas em todos os bancos de dados em busca de incompatibilidades com a versão atual do MySQL Server. Se for encontrada uma tabela com uma possível incompatibilidade, ela será verificada. Se algum problema for encontrado, a tabela será reparada. O mysql_upgrade também atualiza as tabelas do sistema para que você possa tirar proveito dos novos privilégios ou recursos que possam ter sido adicionados.

artamonovdev
fonte
Não sei por que isso não funcionou para mim, tive que remover manualmente todos os gatilhos no ambiente de trabalho mySQL.
user752746
35

Se o usuário existir, então:

mysql> flush privileges;
BroknDodge
fonte
34

Crie o usuário excluído assim:

mysql> create user 'web2vi';

ou

mysql> create user 'web2vi'@'%';
Kevin
fonte
3
depois de criar esse usuário perdeu, encontrou outro erro: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'e deve adicionar este comando grant all on *.* to 'web2vi'@'%' identified by ''após a criação do usuário
zhuguowei
31

Siga esses passos:

  1. Vá para PHPMyAdmin
  2. Selecione seu banco de dados
  3. Selecione sua mesa
  4. No menu superior, clique em 'Triggers'
  5. Clique em 'Editar' para editar o gatilho
  6. Altere o definidor de [user @ localhost] para root @ localhost

Espero que ajude

hussainfrotan
fonte
11
Esta é a solução real para a pergunta, em vez de criar usuário e conceder permissão. apenas mude o definidor.
Ankit Chauhan
Existe alguma maneira de encontrar todos os gatilhos no banco de dados?
9788 Juliet
11
Encontre todos os gatilhos: SHOW TRIGGERS
JerzySkalski
Na linha de comando 'show triggerss', de PhpMyAdmin selecionar o banco de dados e, em seguida, no canto superior direito da barra de navegação, clique nas gatilhos
hussainfrotan
21

A solução é apenas uma consulta de linha única, como abaixo:

grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;

Substitua ROOTpelo seu nome de usuário mysql. Substitua PASSWORDpela sua senha do mysql.

Muhammad Azeem
fonte
11
Cuidado: os usuários do MySQL diferenciam maiúsculas de minúsculas.
Alessio Cantarella
Eu precisava flush privilegesdepois disso e funciona. Obrigado.
Victor
14

Corrigido executando os seguintes comentários.

grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;

se você estiver recebendo some_otherem vez disso web2vi, precisará alterar o nome de acordo.

Selvamani
fonte
13

Para futuros googlers: recebi uma mensagem semelhante tentando atualizar uma tabela em um banco de dados que não continha exibições. Após algumas escavações, verificou-se que eu havia importado gatilhos nessa tabela e essas eram as coisas definidas pelo usuário inexistente. Soltar os gatilhos resolveu o problema.

Chris Poirier
fonte
Triggers foi o problema, atualizei o definidor na seção triggers. sem mais problemas.
Darius
Obrigado, é muito útil. Também é necessário atualizar as visualizações.
toxxxa
De fato, muito útil :) Eu nunca encontraria isso sozinho.
ElChupacabra 11/10
7

O usuário 'web2vi' não existe no seu servidor mysql.

Consulte http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user

Se esse usuário existir, verifique em quais servidores ele pode acessar, embora eu achasse que seria um erro diferente (por exemplo, você pode ter web2vi @ localhost, mas está acessando o banco de dados como web2vi @% (em qualquer coisa)

cosmorogers
fonte
7

correção rápida para contornar e despejar o arquivo:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
Desenvolvedor
fonte
11
isso não funciona. o definidor está contido no despejo.
phil294
Se você usar o mysqlpump com um "p" em vez de um "d", poderá usar --skip-definer
Wouter
@lyhong Não tenho uma explicação detalhada, mas aparentemente --single-transactionaltera a maneira como o Lock Tables é implementado durante um despejo. Ou algo assim. Não me lembro de onde li, mas isso me ajudou a me sentir confortável com "apenas jogar a bandeira". Também estou desconfortável com inexplicáveis ​​'apenas faça isso' "respostas". De qualquer maneira, funcionou para o meu caso.
SherylHohman
7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

exemplo:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
mesutpiskin
fonte
Se eu conceder todos os privilégios a um 'usuário' @ 'todos os ips', e quanto à segurança ?? !!
Mohsen Abasi
@MohsenAbasi Este é um exemplo para o ambiente de desenvolvimento. Este usuário pode ser o administrador do sistema. O ambiente do produto precisa ter mais cuidado.
Mesutpiskin
7

Isso aconteceu comigo depois de mover o banco de dados de um servidor para outro servidor. Inicialmente, o definidor estava usando o host local e o usuário. No novo servidor, não temos esse usuário, e o host também foi alterado. Fiz uma cópia de segurança dessa tabela específica e removi todos os gatilhos manualmente do phpmyadmin . Depois disso, está funcionando bem para mim.

TS Guhan
fonte
Obrigado pela dica, consegui remover manualmente todos os gatilhos no ambiente de trabalho mySQL.
user752746
Este foi realmente um problema gatilho para mim, eu tinha que remover e recriar todos eles
paul.ago
existe outra solução além de recriar gatilhos? estou usando despejos de teste algumas vezes duas vezes por dia. isso iria atrapalhar minhas principais processos
redestructa
@TS Guhan você adicionou novamente os gatilhos depois de removê-los manualmente?
MailBlade 11/04
6

Eu tive o mesmo problema com o usuário root e ele funcionou para mim quando substituí

root@%

de

root@localhost

Portanto, se o usuário 'web2vi' tiver permissão para se conectar a partir de 'localhost', você pode tentar:

web2vi@localhost

Estou conectado remotamente ao banco de dados.

c-toesca
fonte
4

Meus 5 centavos.

Eu tive o mesmo erro enquanto tentava selecionar uma visualização.

No entanto, o problema parece ser que essa exibição, selecionada de outra exibição que foi restaurada do backup de um servidor diferente.

e, de fato, SIM, o usuário era inválido, mas não era óbvio para onde desde o primeiro olhar.

usuario
fonte
4

Eu tive o mesmo problema minutos atrás, deparei-me com este problema após excluir um usuário não utilizado da tabela mysql.user, mas, ao fazer uma alteração alterada, foi corrigido, aqui está um comando útil que o torna muito simples:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ",
table_name," AS ", view_definition,";") FROM 
information_schema.views WHERE table_schema='databasename'

Misture isso com a linha de comando do mysql (assumindo * nix, não familiarizado com o windows):

> echo above_query | mysql -uuser -p > alterView.sql
> mysql -uuser -ppass databasename < alterView.sql

Nota: o comando gera um SELECT CONCAT extra no arquivo, causando mysql -uuser -ppass databasename < alterView.sqlfalha se você não o remover.

Fonte: /dba/4129/modify-definer-on-many-views

Ziul
fonte
4

Tente definir seu procedimento como SECURITY INVOKER

O padrão do Mysql define a segurança dos procedimentos como "DEFINER" (CREATOR OF) .. você deve definir a segurança como "invocador".

Allan Felipe Murara
fonte
3

Sua visualização, "view_quotes" pode ter sido copiada de um banco de dados diferente em que "web2vi" é um usuário válido em um banco de dados em que "web2vi" não é um usuário válido.
Adicione o usuário "web2vi" ao banco de dados ou altere a exibição (normalmente remover a parte DEFINER = 'web2vi' @ '%' e executar o script fará o truque)

user1016736
fonte
3

No meu caso, a tabela teve um gatilho com um usuário DEFINER que não existia.

jbaylina
fonte
2
direito sobre a unha especialmente quando o aplicativo é transferido de um servidor para outro
zardilior
2

Da referência do MySQL de CREATE VIEW:

As cláusulas DEFINER e SQL SECURITY especificam o contexto de segurança a ser usado ao verificar os privilégios de acesso no momento da chamada da visualização.

Este usuário deve existir e é sempre melhor usar 'localhost' como nome do host. Portanto, acho que se você verificar a existência do usuário e alterá-lo para 'localhost' na exibição de criação, não terá esse erro.

jordeu
fonte
2

O problema é claro - o MySQL não consegue encontrar o usuário especificado como definidor.

Encontrei esse problema depois de sincronizar o modelo de banco de dados do servidor de desenvolvimento, aplicá-lo ao localhost, fazer alterações no modelo e reaplicá-lo ao localhost. Aparentemente, havia uma visualização (modificada) definida e, portanto, não pude atualizar minha versão local.

Como consertar (facilmente) :

Nota: envolve a exclusão, portanto funciona bem para visualizações, mas verifique se você possui backup dos dados se tentar isso em tabelas.

  1. Efetue login no banco de dados como raiz (ou o que tiver energia suficiente para fazer alterações).
  2. Exclua a vista, a mesa ou o que estiver com problemas.
  3. Sincronize seu novo modelo - ele não se queixará de algo que não existe agora. Convém remover a parte do SQL SECURITY DEFINER da definição do item com a qual você teve problemas.

PS: Esta não é uma solução adequada nem a melhor para todos. Acabei de publicá-lo como uma solução possível (e muito simples).

Pijusn
fonte
Eu estou usando o sapo, cn eu excluir e recriar usando apenas esse sistema operacional eu devo logar como rooy do terminal e só fazer ??
Vasanth Nag KV
2

Você pode tentar isso:

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;
Sukamdani Barli
fonte
2

Por que estou recebendo esse erro? Como faço para corrigir isso?

Passei uma hora antes de encontrar uma decisão para um problema como esse. Mas, no meu caso, executei o seguinte:

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2;
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Se você realmente deseja encontrar o problema, execute estes comandos um por um:

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

... e, depois de cada um deles, procure o campo 'definer'.

No meu caso, era um gatilho velho barbudo, que alguém dos desenvolvedores esqueceu de excluir.

kivagant
fonte
1

Vá para a seção de edição de rotina e, na parte inferior, altere o Tipo de segurança de Definer para Invoker.

user1174436
fonte
4
Ir para onde? Em qual software?
kenorb
@kenorb, no phpMyAdmin você pode alterar as rotinas armazenadas do MySQL (procedimentos e funções), por exemplo, Tipo de Segurança.
Mikl
1

Uma ou várias visualizações foram criadas / registradas por outro usuário. Você precisará verificar o proprietário da visualização e:

  1. Recrie o usuário; como as outras respostas dizem. ou
  2. Recrie as visualizações criadas pelo usuário 'web2vi'usando ALTER VIEW

Eu tive esse problema uma vez.

Eu estava tentando migrar visualizações, do BD1 para o BD2, usando o SQLYog. O SQLYog recriou as visualizações no outro DataBase (DB2), mas manteve o usuário do BD1 (onde eram diferentes). Mais tarde, percebi que as visualizações que eu estava usando na minha consulta estavam apresentando o mesmo erro que você, mesmo quando não estava criando nenhuma visualização.

Espero que esta ajuda.

Julio Indriago
fonte
1

Se este for um procedimento armazenado, você poderá:

UPDATE `mysql`.`proc` SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'

Mas isso não é aconselhável.

Para mim, a melhor solução é criar o definidor:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
ajudar
fonte
Você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto de 'grant all on' mytable '. * para' myuser 'identificado por' mypass ';' na linha 1
Cerin 27/06
@Cerin, basta alterar '' em torno da minha tabela para ``. Minha resposta tem como objetivo ajudar as pessoas com este problema .. Pense reconsiderando sua downvote ..
helpse
1

quando o mysql.proc estiver vazio, mas o sistema sempre aviso "[email protected].%" para table_name não existe, basta fazer root na linha de comando do mysql e digitar:

CHECK TABLE `database`.`table_name` QUICK FAST MEDIUM CHANGED;
flush privileges;

sobre!

zhi.yang
fonte
1

Isso aconteceu depois que eu importei um despejo no Windows 10 com a Comunidade MYSQL Workbench 6.3, com "root @% is not exist". Mesmo que o usuário existisse. Primeiro, tentei comentar o DEFINER, no entanto, isso não funcionou. Em seguida, substitui uma string em "root @%" por "root @ localhost" e reimportei o dump. Isso fez o truque para mim.

Dévan Coetzee
fonte
0

O usuário do banco de dados também parece fazer distinção entre maiúsculas e minúsculas; portanto, enquanto eu tinha um usuário raiz '@'%, não tinha um usuário ROOT '@'%. Alterei o usuário para maiúsculas via ambiente de trabalho e o problema foi resolvido!

Metalmania
fonte