Могу ли я СОЗДАТЬ TRIGGER в БД RDS? - PullRequest
50 голосов
/ 19 января 2012

Я пытаюсь создать триггер для таблицы в моей базе данных Amazon RDS, и я не могу этого добиться.

Я пытался создать триггер для таблицы в клиенте mysqlЯ использую (Navicat), и получил ошибку, что мне нужна привилегия SUPER для этого.После некоторых поисков я обнаружил, что вы можете SET GLOBAL log_bin_trust_function_creators = 1 обойти это.Я попробовал это, используя следующие инструкции: http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ (а затем перезапустил сервер БД для хорошей меры), но безуспешно.

Я также попытался создать триггер и установить переменную через строку команды mysqlчтобы убедиться, что Navicat не добавляет ничего нежелательного в мои команды sql, но это тоже не удалось.Из поиска также видно, что невозможно предоставить себе привилегию SUPER.

Итак ... возможно ли создание триггера в RDS?

Ответы [ 7 ]

108 голосов
/ 31 октября 2013

Это просто!

Откройте веб-консоль RDS.

Откройте вкладку «Группы параметров».

Создайте новую группу параметров.В диалоговом окне выберите семейство MySQL, совместимое с вашей версией базы данных MySQL, дайте ему имя и подтвердите.

Выберите только что созданную группу параметров и введите «Редактировать параметры».

Найдитепараметр 'log_bin_trust_function_creators' и установить его значение равным '1'.

Сохранить изменения.

Открыть вкладку «Экземпляры».Разверните свой экземпляр MySQL и выполните «Действие экземпляра» с именем «Изменить».

Выберите только что созданную группу параметров и включите «Применить немедленно».

Нажмите «Продолжить» и подтвердите изменения.

Снова откройте вкладку «Экземпляры».Разверните свой экземпляр MySQL и введите «Действие экземпляра» с именем «Изменить».

Не забудьте: откройте вкладку «Экземпляры».Разверните свой экземпляр MySQL и выполните «Действие экземпляра» с именем «Перезагрузка».

Через - http://techtavern.wordpress.com/2013/06/17/mysql-triggers-and-amazon-rds/

37 голосов
/ 30 апреля 2012

Нет, на самом деле это не невозможно, просто требуется слишком много дополнительной работы.

Во-первых, кажется невозможным применить Super Privileges к группе параметров по умолчанию.Так что мне нужно было создать новую группу параметров БД либо через консоль, либо через CLI.

Я обнаружил, что ключом является то, что регион по умолчанию не был регионом, который я пытался использовать, поэтому мне пришлось использовать параметр --region, чтобы применить его к группе в правильном регионегде я развертывал свой инстанс БД

rds-create-db-группа-параметров -db-параметр-группа-имя-имя allow-triggers --description 'группа параметров, чтобы разрешить триггеры' --regionyour-region

Затем я должен был создать экземпляр БД, который использовал эту группу параметров.(Снова через консоль или CLI)

rds-create-db-instance

Затем мне пришлось изменить группу параметров, чтобы разрешить log_bin_trust_function_creators только через CLI

rds-modify-db-parameter-group --db-parameter-group-name имя вашей группы --region yourRegion --parameters 'name = log_bin_trust_function_creators, значение = true, метод = немедленный'

Наконец мне пришлось изменитьсоздан экземпляр БД для разрешения триггеров, также только для CLI.

rds-modify-db-instance --db-instance-identifier your-db-instance-id --db-параметр-group-name allow-triggers--apply-немедленно

16 голосов
/ 04 ноября 2014

В дополнение к модификации группы параметров, о которой уже упоминали другие, существует еще одна проблема, возникающая при использовании дампа базы данных MySQL (через mysqldump) для создания триггеров в экземпляре AWS RDS.Вы можете получить следующее сообщение:

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

Это происходит потому, что дамп содержит «определенные» записи с именем пользователя, которое отличается от вашего основного имени пользователя RDS.Одним из решений является замена определенного имени пользователя вашим основным именем пользователя RDS.Другое решение - не использовать mysqldump для создания базы данных.

См. Этот блог для получения дополнительной информации:

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

6 голосов
/ 06 апреля 2015

РЕДАКТИРОВАТЬ: Оказывается, Multi-AZ для MySQL использует "физическую репликацию", а не логическую репликацию, поэтому это может быть неправильно. По крайней мере, так говорится в их документации: https://aws.amazon.com/rds/details/multi-az/ - я спрашивал на их форумах, что это значит, но не получил ответа. Что странно, так это то, что мой экземпляр RDS Multi-AZ утверждает, что это «мастер в настройке репликации», хотя у меня нет реплик чтения.


Поскольку вопрос уже был рассмотрен, это комментарий больше, чем ответ:

Я удивлен, что никто не принимает во внимание , почему эта функция не доступна по умолчанию. Амазонка не отключит его, чтобы сделать жизнь людей сложнее.

В репликации master / slave может быть опасно использовать хранимые процедуры и триггеры, которые изменяют данные (как при выполнении запросов, отличных от SELECT ).

Прочтите ниже, прежде чем отключить это ограничение в настройках master / slave, каковым является Amazon RDS, когда вы используете Multi-AZ (и вы должны, по крайней мере, для производства).

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

1 голос
/ 23 июня 2017

Для меня это сработало как answer @ 1002 * ответа @ foxybagga, но мне нужно было обновить сгенерированный дамп sql (из mysqlworkbench), чтобы CURRENT_USER был DEFINER

есть:

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

Надеюсь, это поможет кому-то иметь такую ​​же проблему.

1 голос
/ 17 апреля 2016

AWS описывает, как включить функции, и вызывает в в этом сообщении

  1. Создайте группу параметров БД для вашего экземпляра MySQL: Войдите в консоль управления AWS и откройте консоль Amazon RDS . В области навигации выберите Группы параметров. Выберите Создать группу параметров. Откроется окно «Создать группу параметров». Для семейства групп параметров выберите семейство групп параметров. В поле «Имя группы» введите имя новой группы параметров БД. В поле Описание введите описание новой группы параметров БД. Выберите Создать. Важный После создания группы параметров БД вы должны подождать не менее 5 минут, прежде чем создавать свой первый экземпляр БД, который использует эту группу параметров БД.

Для получения дополнительной информации о создании группы параметров БД см. Работа с группами параметров БД - Создание группы параметров БД.

  1. Изменить вновь созданную группу параметров и установить следующий параметр: В области навигации выберите Группы параметров. Доступные группы параметров БД появятся в списке. В списке выберите группу параметров, которую вы хотите изменить. Выберите «Изменить параметры» и установите для следующего параметра указанное значение: log_bin_trust_function_creators = 1 Выберите Сохранить изменения. Важный После изменения группы параметров БД вам следует подождать не менее 5 минут, прежде чем создавать свой первый экземпляр БД, который использует эту группу параметров БД.

Для получения информации о модификации группы параметров БД см. Работа с группами параметров БД - Изменение параметров в группе параметров БД.

  1. Свяжите свой экземпляр RDS DB с новой или измененной группой параметров DB: На панели навигации выберите Экземпляры. Выберите экземпляр БД, который вы хотите связать с группой параметров БД. В меню Действия экземпляра выберите Изменить. В диалоговом окне «Изменить экземпляр БД» в разделе «Параметры базы данных» выберите группу параметров, которую вы хотите связать с экземпляром БД. Изменение этого параметра не приводит к отключению. Имя группы параметров изменяется немедленно, но фактические изменения параметров не применяются, пока вы не перезагрузите экземпляр без отработки отказа. Примените изменения, перезагрузив экземпляр.
1 голос
/ 01 октября 2013

Я следовал вышесказанному, но у меня это не сработало. Я провел почти день, чтобы выяснить, почему это не работает, и теперь я знаю, почему. Я перечисляю шаги, которые я выполнил, чтобы заставить его работать.

Создана группа параметров mysql с помощью веб-консоли aws (убедитесь, что она должна иметь то же семейство, что и группа параметров по умолчанию. Ранее я создал группу параметров, но у нее было другое семейство, и поэтому она не работала. Это важный шаг .

Используя веб-консоль aws, измените значение log_bin_trust_function_creators на 1

Применить новую группу параметров. Это еще один важный шаг

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

Вам нужен RDSCli из - http://s3.amazonaws.com/rds-downloads/RDSCli.zip

Затем проверьте, связана ли группа параметров с вашим экземпляром БД.

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

А затем перезагрузите компьютер, прежде чем пытаться создать триггер

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

Не забудьте установить ниже переменную окружения, прежде чем пытаться указывать выше команды.

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)

Спасибо http://blog.iprofs.nl/2013/03/20/rds-database-triggers-for-mysql/ за полную информацию.

...