Você provavelmente precisará de log_bin_trust_function_creators
= 1 no RDS, mas esse não é o problema aqui.
You can specify a
DEFINER
value other than your own account only if you have theSUPER
privilege.— http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html
Quando um programa armazenado (proc, function, event ou trigger) está em execução, tudo o que ele faz tem as permissões do usuário que o definiu ou do usuário explicitamente declarado com uma declaração DEFINER
. Isso permite, entre outras coisas, que os programas armazenados permitam que outros usuários façam coisas com dados que eles não têm permissão para manipular diretamente, desde que tenham permissão para usar o próprio programa armazenado.
Seria uma vulnerabilidade séria, então, se um usuário que não fosse SUPER
pudesse criar um procedimento com um definidor arbitrário, porque o usuário poderia escalonar seus privilégios à vontade.
Isso também vale para as visualizações, é claro, quando o contexto de segurança definidor é usado, como no exemplo que você postou.
Uma das maiores reclamações que tenho com o RDS é que você não pode ter SUPER
... e agora ele pode ser um dos seus também :) porque esse fato é a causa do problema que você está tendo.
É claro que, se eu estivesse executando um serviço MySQL gerenciado, também não daria a ninguém SUPER
, portanto seu modelo de segurança faz sentido, mesmo que às vezes seja difícil de gerenciar.
Se todos os seus objetos tiverem o mesmo definidor, uma solução alternativa seria restaurar o despejo usando essa conta em vez da que você está usando agora, mas isso parece improvável.
Excluir apenas a linha com a declaração DEFINER
deve fazer o dumpfile funcionar nos casos em que ela aparece em uma linha sozinha, ou você pode usar sed ou perl para modificar o arquivo ... uma ideia que eu já conheço não gostei muito, mas é realmente uma coisa legal sobre o MySQL que tal hackery é bastante legítimo, e não realmente muito distante dos tipos de coisas que eu tenho que fazer como um DBA mesmo em um ambiente não-RDS. / p>
perl -pe 's/\sDEFINER='[^']+'@'[^']+'//' < oldfile.sql > newfile.sql
... possivelmente não é a resposta que você esperava, mas você pode executar isso contra o dumpfile e deve acabar com um arquivo um pouco mais utilizável.