web-dev-qa-db-fra.com

Puis-je CRÉER TRIGGER dans une base de données rds?

J'essaie de créer un déclencheur sur une table dans ma base de données Amazon RDS, et je n'arrive pas à y arriver.

J'ai essayé de créer un déclencheur sur une table dans le client mysql que j'utilise (Navicat), et j'ai eu l'erreur que j'avais besoin du privilège SUPER pour le faire. Après quelques recherches, j'ai découvert que vous pouviez SET GLOBAL log_bin_trust_function_creators = 1 pour contourner cela. J'ai essayé cela en utilisant ces instructions: http://getasysadmin.com/2011/06/Amazon-rds-super-privileges/ (puis redémarrer le serveur DB pour faire bonne mesure), mais pas de chance.

J'ai également essayé de créer le déclencheur et de définir la variable via la ligne de commande mysql pour m'assurer que Navicat n'ajoutait rien de indésirable à mes commandes sql, mais cela a également échoué. Il semble également, lors de la recherche, qu'il n'y a aucun moyen de vous accorder le privilège SUPER.

Alors ... la création d'un déclencheur est-elle possible dans RDS?

50
tedders

Non, ce n'est en fait pas impossible, cela demande juste beaucoup trop de travail supplémentaire.

Tout d'abord, il semble impossible d'appliquer des Super Privilèges à un groupe de paramètres par défaut. Donc, ce que je devais faire était de créer un nouveau groupe de paramètres DB soit via la console, soit via la CLI.

Ce que j'ai trouvé était, la clé est que la région par défaut n'était pas la région que j'essayais d'utiliser donc j'ai dû utiliser un paramètre --region pour l'appliquer au groupe dans la bonne région où je déployais mon Instance DB

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

Ensuite, j'ai dû créer une instance DB qui utilisait ce groupe de paramètres. (Encore une fois via la console ou CLI)

rds-create-db-instance

Ensuite, j'ai dû modifier le groupe de paramètres pour autoriser log_bin_trust_function_creators uniquement réalisable via la CLI

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

Enfin, j'ai dû modifier l'instance DB créée pour autoriser les déclencheurs, également CLI uniquement.

rds-modify-db-instance --db-instance-identifier your-db-instance-id --db-parameter-group-name allow-triggers --apply-immediately
38
Garvice

C'est facile!

Ouvrez la console Web RDS.

Ouvrez l'onglet "Groupes de paramètres".

Créez un nouveau groupe de paramètres. Dans la boîte de dialogue, sélectionnez la famille MySQL compatible avec votre version de base de données MySQL, donnez-lui un nom et confirmez.

Sélectionnez le groupe de paramètres que vous venez de créer et lancez "Modifier les paramètres".

Recherchez le paramètre "log_bin_trust_function_creators" et définissez sa valeur sur "1".

Enregistrez les modifications.

Ouvrez l'onglet "Instances". Développez votre instance MySQL et lancez l '"Action d'instance" nommée "Modifier".

Sélectionnez le groupe de paramètres que vous venez de créer et activez "Appliquer immédiatement".

Cliquez sur "Continuer" et confirmez les modifications.

Encore une fois, ouvrez l'onglet "Instances". Développez votre instance MySQL et lancez l '"Action d'instance" nommée "Modifier".

N'oubliez pas: ouvrez l'onglet "Instances". Développez votre instance MySQL et lancez l '"Action d'instance" nommée "Redémarrer".

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

108
foxybagga

En plus de la modification du groupe de paramètres que d'autres ont déjà mentionnée, un autre défi se pose lors de l'utilisation d'un vidage de base de données MySQL (via mysqldump) pour créer des déclencheurs dans une instance AWS RDS. Vous pouvez obtenir un message comme celui-ci:

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

Cela se produit car le vidage contient des entrées "définiteur" avec un nom d'utilisateur différent de votre nom d'utilisateur maître RDS. Une solution consiste à remplacer le nom d'utilisateur définitif par votre nom d'utilisateur maître RDS. Une autre solution consiste à ne pas utiliser mysqldump pour créer votre base de données.

Voir cet article de blog pour plus d'informations:

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

16
Willie Wheeler

EDIT: Il s'avère que Multi-AZ pour MySQL utilise la "réplication physique" et non la réplication logique, donc cela peut ne pas être correct. C'est du moins ce que dit leur documentation: https://aws.Amazon.com/rds/details/multi-az/ - J'ai demandé sur leur forum ce que cela signifie, mais je n'ai pas eu de réponse . Ce qui est bizarre, c'est que mon instance RDS Multi-AZ prétend qu'il s'agit d'un "maître dans une configuration de réplication", même si je n'ai pas de réplicas en lecture.


La question ayant déjà été abordée, il s'agit plus d'un commentaire que d'une réponse:

Je suis surpris que personne ne prenne en compte pourquoi cette fonctionnalité n'est pas disponible par défaut. Amazon ne le désactiverait pas simplement pour rendre la vie des gens plus difficile.

Dans une réplication maître/esclave, il peut être dangereux d'utiliser des procédures stockées et des déclencheurs qui modifient les données (comme dans les requêtes autres que [~ # ~] sélectionnez [~ # ~]).

Veuillez lire ci-dessous avant de désactiver cette restriction dans une configuration maître/esclave, ce qu'est Amazon RDS lorsque vous utilisez Multi-AZ (et vous devriez, pour la production au moins).

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

6
nickdnk

Pour moi, cela fonctionnait comme le suggère @ @ foxybagga answer , mais je devais mettre à jour le vidage du sql généré (depuis mysqlworkbench) pour avoir CURRENT_USER comme DEFINER

c'est à dire:

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 */ ;

J'espère que cela aide quelqu'un à avoir le même problème.

1
cesaregb

J'ai suivi ce qui précède mais cela n'a pas fonctionné pour moi. J'ai passé presque une journée à comprendre pourquoi cela ne fonctionne pas et maintenant je sais pourquoi. Je liste les étapes que j'ai suivies pour le faire fonctionner.

Création du groupe de paramètres mysql à l'aide de la console Web aws (assurez-vous qu'il doit avoir la même famille que le groupe de paramètres par défaut. Plus tôt, j'avais créé un groupe de paramètres mais il avait une famille différente et donc cela ne fonctionnait pas. C'est une étape critique.

L'utilisation de la console Web aws modifie la valeur de log_bin_trust_function_creators à 1

Appliquer un nouveau groupe de paramètres. Ceci est une autre étape critique

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

Vous avez besoin de RDSCli depuis - http://s3.amazonaws.com/rds-downloads/RDSCli.Zip

Vérifiez ensuite si le groupe de paramètres est associé à votre instance de base de données

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

Et puis redémarrez avant d'essayer de créer un déclencheur

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

N'oubliez pas de définir la variable d'environnement ci-dessous avant d'essayer les commandes ci-dessus.

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)

Merci à http://blog.iprofs.nl/2013/03/20/rds-database-triggers-for-mysql/ pour tous les détails.

1
Deepti Kohli

AWS explique comment activer les fonctions et déclencheurs dans ce message

  1. Créez un groupe de paramètres DB pour votre instance MySQL: connectez-vous à AWS Management Console et ouvrez Amazon RDS console . Dans le volet de navigation, choisissez Groupes de paramètres. Choisissez Créer un groupe de paramètres. La fenêtre Créer un groupe de paramètres apparaît. Pour la famille de groupes de paramètres, choisissez la famille de groupes de paramètres. Pour Group Name, saisissez le nom du nouveau groupe de paramètres DB. Pour Description, saisissez une description pour le nouveau groupe de paramètres DB. Choisissez Créer. Important Après avoir créé un groupe de paramètres DB, vous devez attendre au moins 5 minutes avant de créer votre première instance DB qui utilise ce groupe de paramètres DB.

Pour plus d'informations sur la création d'un groupe de paramètres DB, voir Utilisation des groupes de paramètres DB - Création d'un groupe de paramètres DB.

  1. Modifiez le groupe de paramètres nouvellement créé et définissez le paramètre suivant: Dans le volet de navigation, choisissez Groupes de paramètres. Les groupes de paramètres DB disponibles apparaissent dans une liste. Dans la liste, sélectionnez le groupe de paramètres que vous souhaitez modifier. Choisissez Modifier les paramètres et définissez le paramètre suivant sur la valeur spécifiée: log_bin_trust_function_creators = 1 Choisissez Enregistrer les modifications. Important Après avoir modifié un groupe de paramètres DB, vous devez attendre au moins 5 minutes avant de créer votre première instance DB qui utilise ce groupe de paramètres DB.

Pour plus d'informations sur la modification d'un groupe de paramètres DB, voir Utilisation des groupes de paramètres DB - Modification des paramètres dans un groupe de paramètres DB.

  1. Associez votre instance DB RDS au groupe de paramètres DB nouveau ou modifié: dans le volet de navigation, choisissez Instances. Sélectionnez l'instance de base de données que vous souhaitez associer à un groupe de paramètres de base de données. Dans le menu Actions d'instance, choisissez Modifier. Dans la boîte de dialogue Modifier l'instance de base de données, sous Options de base de données, choisissez le groupe de paramètres que vous souhaitez associer à l'instance de base de données. La modification de ce paramètre n'entraîne pas de panne. Le nom du groupe de paramètres change immédiatement, mais les modifications réelles des paramètres ne sont appliquées qu'après le redémarrage de l'instance sans basculement. Appliquez les modifications en redémarrant l'instance.
1
Loourr