¿Puedo CREAR TRIGGER en una base de datos rds?


Estoy tratando de crear un disparador en una tabla en mi base de datos de Amazon RDS, y parece que no puedo hacerlo realidad.

Traté de crear un disparador en una tabla en el cliente mysql que uso (Navicat), y obtuve el error de que necesitaba el SÚPER privilegio para hacerlo. Después de algunas búsquedas, encontré que podrías SET GLOBAL log_bin_trust_function_creators = 1 sortear esto. Lo intenté usando estas instrucciones: http://getasysadmin.com/2011/06/amazon-rds-super-privileges / (y luego reiniciar el servidor DB para una buena medida), pero no hubo suerte.

También intenté crear el disparador y establecer la variable a través de la línea de comando mysql para asegurarme de que Navicat no estaba agregando nada no deseado a mis comandos sql, pero eso también falló. También parece a partir de la búsqueda de que no hay manera de otorgarse el SÚPER privilegio.

So ... ¿es posible crear un disparador en RDS?

Author: Viccari, 2012-01-19

7 answers

No, en realidad no es imposible, solo requiere demasiado trabajo extra.

En primer lugar, parece imposible aplicar Súper Privilegios al grupo de parámetros predeterminado. Así que lo que tuve que hacer fue crear un nuevo grupo de parámetros de base de datos, ya sea a través de la consola, o la CLI.

Lo que encontré fue que la clave es que la región predeterminada no era la región que estaba tratando de usar, así que tuve que usar un parámetro region region para aplicarlo al grupo en la región correcta donde estaba implementando mi Instancia de base de datos

Rds-create-db-parameter-group db db-parameter-group-name allow-triggers description description ' parameter group to allow triggers 'your region your-region

Luego tuve que crear una instancia de base de datos que usara ese grupo de parámetros. (De nuevo a través de la consola o CLI)

Rds-create-db-instance

Entonces tuve que modificar el grupo de parámetros para permitir log_bin_trust_function_creators solo realizable a través de la CLI

Rds-modify-db-parameter-group -- db-parameter-group-name yourgroupname region region yourRegion parameters parameters 'name = log_bin_trust_function_creators, value = true, method=immediate'

Finalmente tuve que modificar la instancia de base de datos creada para permitir disparadores, también solo CLI.

Rds-modify-db-instance identifier db-instance-identifier your-db-instance-id {db-parameter-group-name allow-triggers {apply-immediately

 34
Author: Garvice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-30 09:57:06

Es fácil!

Abra la consola web RDS.

Abra la pestaña "Grupos de parámetros".

Cree un nuevo grupo de Parámetros. En el cuadro de diálogo, seleccione la familia MySQL compatible con su versión de base de datos MySQL, déle un nombre y confirme.

Seleccione el Grupo de Parámetros recién creado y emita "Editar parámetros".

Busque el parámetro 'log_bin_trust_function_creators' y establezca su valor en '1'.

Guarde los cambios.

Abra la pestaña "Instancias". Ampliar su instancia de MySQL y emitir la "Acción de instancia "llamado " Modificar".

Seleccione el Grupo de parámetros recién creado y habilite "Aplicar inmediatamente".

Haga clic en "Continuar" y confirme los cambios.

De nuevo, abra la pestaña "Instancias". Expanda su instancia de MySQL y emita la" Acción de instancia "llamada"Modificar".

No lo olvide: Abra la pestaña "Instancias". Expanda su instancia de MySQL y ejecute la " Acción de instancia "llamada"Reboot".

Via - http://techtavern.wordpress.com/2013/06/17/mysql-triggers-and-amazon-rds /

 99
Author: foxybagga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 10:00:12

Además de la modificación del grupo de parámetros que otros ya han mencionado, hay un desafío adicional que surge cuando se usa un volcado de base de datos MySQL (a través de mysqldump) para crear disparadores en una instancia de AWS RDS. Usted puede recibir un mensaje como este:

ERROR 1227 (42000) at line 875: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Esto sucede porque el volcado contiene entradas "definer" con un nombre de usuario que es diferente a su nombre de usuario maestro RDS. Una solución es reemplazar el nombre de usuario del definidor con su nombre de usuario maestro RDS. Otra solución no es para usar mysqldump para crear su base de datos.

Ver esta entrada del blog para más información:

Http://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/

 13
Author: Willie Wheeler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-04 06:33:15

EDIT: Resulta que Multi-AZ para MySQL usa "replicación física" y no replicación lógica, por lo que esto puede no ser correcto. Al menos eso es lo que dice su documentación: https://aws.amazon.com/rds/details/multi-az / - He preguntado en sus foros qué significa esto, pero no he recibido respuesta. Lo que es extraño es que mi instancia RDS Multi-AZ afirma que es un "maestro en una configuración de replicación", a pesar de que no tengo réplicas de lectura.


Como la pregunta ya ha sido dirigido, este es un comentario más que una respuesta:

Me sorprende que nadie tenga en cuenta por qué esta función no está disponible por defecto. Amazon no lo desactivaría solo para hacer la vida de las personas más difícil.

En una replicación maestro/esclavo puede ser peligroso usar procedimientos almacenados y disparadores que modifican datos (como en realizar consultas que no sean SELECT).

Por favor, lea a continuación antes de deshabilitar esta restricción en una configuración maestro/esclavo, que Amazon RDS es cuando se utiliza Multi-AZ (y debería, al menos para producción).

Http://dev.mysql.com/doc/refman/5.6/en/stored-programs-logging.html

 5
Author: nickdnk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-10 18:24:49

Seguí lo anterior, pero no funcionó para mí. Pasé casi un día para averiguar por qué no está funcionando y ahora sé por qué. Estoy enumerando los pasos que seguí para que funcione.

Se creó el grupo de parámetros de mysql utilizando aws web console (asegúrese de que debe tener la misma familia que el grupo de parámetros predeterminado. Anteriormente, había creado un grupo de parámetros, pero tenía una familia diferente, por lo que no funcionó. Este es un paso crítico.

Usando aws web console cambiar el valor de log_bin_trust_function_creators a 1

Aplique un nuevo grupo de parámetros. Este es otro paso crítico

rds-modify-db-instance –I $AWS_ACCESS_KEY –S $AWS_SECRET_KEY –region $EC2_REGION \ –db-instance-identifier $DB_INSTANCE \
–db-parameter-group-name $DB_GROUPNAME \
–apply-immediately

Necesita RDSCli de - http://s3.amazonaws.com/rds-downloads/RDSCli.zip

Luego verifique si el grupo de parámetros está asociado con su instancia de base de datos

rds-describe-db-instances \
–I $AWS_ACCESS_KEY \
–S $AWS_SECRET_KEY \
–region $EC2_REGION

Y luego reinicie antes de intentar crear trigger

rds-reboot-db-instance \
–I $AWS_ACCESS_KEY \
–S $AWS_SECRET_KEY \
–region $EC2_REGION  \
–db-instance-identifier $DB_INSTANCE

Recuerde establecer la variable de entorno inferior antes de probar los comandos anteriores.

export AWS_ACCESS_KEY=’*****’
export AWS_SECRET_KEY=’*****’
export EC2_REGION=’region’
export AWS_RDS_BIN=”$AWS_RDS_HOME/bin”
export PATH=$PATH:$AWS_RDS_BIN
export JAVA_HOME=c:/jdk1.6_25 (in most cases this is already set)

Gracias a http://blog.iprofs.nl/2013/03/20/rds-database-triggers-for-mysql/ para más detalles.

 1
Author: Deepti Kohli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-01 07:17:22

AWS explica cómo habilitar funciones y disparadores en este post

  1. Cree un grupo de parámetros de BD para su instancia MySQL: Inicie sesión en la consola de administración de AWS y abra la consola de Amazon RDS . En el panel de navegación, elija Grupos de parámetros. Elija Crear Grupo de Parámetros. Aparecerá la ventana Crear grupo de parámetros. En Familia de grupos de parámetros, elija la familia de grupos de parámetros. En Nombre de grupo, escriba el nombre del nuevo grupo de parámetros de la base de datos. Para Descripción, escriba una descripción para el nuevo grupo de parámetros de la base de datos. Elige Crear. Importante Después de crear un grupo de parámetros de base de datos, debe esperar al menos 5 minutos antes de crear la primera instancia de base de datos que utilice ese grupo de parámetros de base de datos.

Para obtener más información sobre cómo crear un grupo de parámetros de BD, consulte Trabajar con grupos de parámetros de BD - Crear un grupo de parámetros de BD.

  1. Modifique el grupo de parámetros recién creado y establezca el siguiente parámetro: En el panel de navegación, elija Grupos de parámetros. Los grupos de parámetros de BD disponibles aparecen en una lista. En la lista, seleccione el grupo de parámetros que desea modificar. Elija Editar parámetros y establezca el siguiente parámetro en el valor especificado: log_bin_trust_function_creators = 1 Elija Guardar Cambios. Importante Después de modificar un grupo de parámetros de base de datos, debe esperar al menos 5 minutos antes de crear la primera instancia de base de datos que utilice ese grupo de parámetros de base de datos.

Para obtener información sobre cómo modificar un grupo de parámetros de la base de datos, consulte Trabajar con Grupos de Parámetros de Base de datos-Modificar parámetros en un grupo de parámetros de Base de datos.

  1. Asocie su instancia de base de datos RDS con el grupo de parámetros de base de datos nuevo o modificado: En el panel de navegación, seleccione Instancias. Seleccione la instancia de base de datos que desea asociar a un grupo de parámetros de base de datos. En el menú Acciones de instancia, seleccione Modificar. En el cuadro de diálogo Modificar instancia de base de datos, en Opciones de base de datos, elija el grupo de parámetros que desea asociar a la instancia de base de datos. Cambiar esta configuración no el resultado es un corte. El nombre del grupo de parámetros cambia inmediatamente, pero los cambios de parámetros reales no se aplican hasta que reinicie la instancia sin conmutación por error. Aplicar cambios reiniciando la instancia.
 1
Author: Loourr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-17 01:22:26

Para mí, funcionó como la respuesta de @foxybagga sugiere, pero necesitaba actualizar el volcado de sql generado (desde mysqlworkbench) para tener CURRENT_USER como DEFINIDOR

Ie:

DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=CURRENT_USER*/ /*!50003 TRIGGER `sod_db`.`date`
BEFORE INSERT ON `sod_db`.`CashOut`
FOR EACH ROW
BEGIN
SET NEW.created = NOW();
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

Espero que esto ayude a que alguien tenga el mismo problema.

 1
Author: cesaregb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 23:10:10