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?


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.


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.


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.


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


34

Crie o usuário excluído assim:

mysql> create user 'web2vi';

ou

mysql> create user 'web2vi'@'%';

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


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.


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.


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.


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

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

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql

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;

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.


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.


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.


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


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".


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)


3

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


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.


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).


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;

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.


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.


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.


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';

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 "user@192.168.%" 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!


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.



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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.