Как изменить объем MySQL Triggers DEFINER
Я работал над нашим внутренним сервером разработки и создавал MySQL Triggers на нашем сервере MySQL 5.6.13. Проблема, которую я сейчас имею, это триггеры (всего около 200) были созданы с DEFINER = root
@%
на внутреннем сервере.
Теперь я хочу перейти на живой сервер. Однако на нашем реальном сервере мы не разрешаем этот доступ для пользователя root. Поэтому, как я могу изменить объем всех моих триггеров, чтобы он читал DEFINER = root
@localhost
Ответы
Ответ 1
Один из способов сделать это:
1) Определения триггеров дампа в файл
# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info \
--no-data --no-create-db --skip-opt test > /tmp/triggers.sql
2) Откройте файл triggers.sql
в вашем любимом редакторе и используйте функцию Find and Replace
, чтобы изменить DEFINER
s. Сохранить обновленный файл.
3) Восстановить триггеры из файла
# mysql < triggers.sql
Ответ 2
Без использования опции -add-drop-trigger:
currentUserDefiner='root'
currentHostDefiner='localhost'
newUserDefiner='user'
newHostDefiner='localhost'
db='myDb'
mysqldump -u root --triggers --no-create-info --no-data --no-create-db --skip-opt $db \
| perl -0777 -pe 's/(\n\/\*.+?50003 TRIGGER `([^`]+)`)/\nDROP TRIGGER \2;\1/g' \
| perl -0777 -pe 's/(DEFINER[^`]+)'$currentUserDefiner'(`@`)'$currentHostDefiner'/\1'$newUserDefiner'\2'$newHostDefiner'/gi' \
> out.sql
mysql -u root < out.sql
Ответ 3
Принятый ответ не сработал у меня, потому что большинство моих клиентов размещены на серверах с 5.5, и я не могу это сделать, и - Функция -add-drop-trigger добавлена в 5.6
После того, как я наткнулся на это, я просто вошел в phpMyAdmin, который предоставляет определитель на странице редактирования триггера, и я просто отредактировал определитель для 20 или около того триггеров, которые были неправильными - phpMyAdmin закроет и заново создаст триггер с новый определитель.
Еще один вариант, который я нашел, - сделать полный mysqldump, отредактировать полученный файл, использовать его для создания новой базы данных, а затем использовать такой инструмент, как Navicat, для выполнения синхронизации структуры с исходной базой данных, выбрав только нужные триггеры в в результате список сравнения. Это был гораздо более длительный процесс для меня, потому что мне нужно было только отредактировать 20 триггеров, но если мне пришлось обновить сотни триггеров, это будет быстрее.
Ответ 4
Другим подходом является использование этой утилиты Java. Обратите внимание: это текущая работа, так как текущая версия 1.0 очищает некоторые серверные переменные.
newdef
Ответ 5
Еще одна вариация темы, использующая опцию в MySQL Workbench, заключается в том, чтобы сбрасывать всю базу данных с помощью "mysqldump", открывать дамп в подходящем редакторе, находить замену с помощью требуемого "DEFINER", а затем импортировать с помощью MyQSL Workbench с помощью "Дампа" Вариант структуры "(v6.2), выбранный на экране импорта.
Ответ 6
Я знаю это старое сообщение, но, возможно, это может помочь кому-то.
Я использую этот sql-запрос для создания команды DROP и CREATE:
SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "yourdatabase";
Я использую это в своем приложении, когда беру производственную базу данных на свою машину разработки и отправляю ее с помощью foreach по всем командам и автоматически создаю триггеры. Это дает мне возможность автоматизировать его.
Пример в PHP/Laravel:
$this->info('DROP and CREATE TRIGGERS');
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach($result as $rs){
$pdo = DB::unprepared($rs['sqlCommand']);
break;
}
Подсказка: я должен сделать это с pdo из-за проблемы с запросом буфера mysql, описанного здесь
То же самое я делаю для своих просмотров (здесь вы можете использовать ALTER TABLE):
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("ALTER DEFINER='homestead' VIEW ", table_name," AS ", view_definition,";") AS sqlCommand FROM information_schema.views WHERE table_schema="mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->info('View definer changed');
foreach($result as $rs){
$pdo = DB::unprepared($rs['sqlCommand']);
}
Надеюсь, поможет.