2013-09-03 12 views
14

Pracowałem nad naszym wewnętrznym serwerem rozwoju i tworzeniem wyzwalaczy MySQL na naszym serwerze MySQL 5.6.13. Problem, który mam teraz, to wyzwalacze (w sumie około 200) zostały utworzone jako DEFINER = root @% na wewnętrznym serwerze.Jak zmienić masowo wyzwalacze MySQL DEFINER

Teraz chcę przejść do serwera produkcji na żywo. Jednak na naszym serwerze na żywo nie zezwalamy na dostęp dla użytkownika root. W związku z tym w jaki sposób można zbiorczo zmienić wszystkie moje wyzwalaczy, tak, że czyta Definer = root @localhost

Odpowiedz

36

Jednym ze sposobów, aby to zrobić:

1) Dump definicji wyzwalacza do pliku

# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info \ 
     --no-data --no-create-db --skip-opt test > /tmp/triggers.sql 

2) Otwórz plik triggers.sql w ulubionym edytorze i użyj funkcji Find and Replace, aby zmienić DEFINER s. Zapisz zaktualizowany plik.

3) Odtworzenie wyzwala z pliku

# mysql < triggers.sql 
+1

Na komputerze Mac otrzymuję komunikat "nieznana opcja: --add-drop-trigger" w systemie Mac OS X z serwerem Zend – Wouter

+2

Działa to tylko w niektórych środowiskach. Nie działa na społeczności 5.5.36 na centOS ... "mysqldump: nieznana opcja" --add-drop-trigger "" –

+0

to działa dla mnie. – Janath

1

Przyjęte rozwiązanie nie działa dla mnie, ponieważ większość moich klientów są przechowywane na serwerach z 5,5 i niewiele mogę na to poradzić, a --add-drop-trigger function was added in 5.6

Po tym, jak uderzyłem w głowę, po prostu wszedłem do phpMyAdmina, który odsłonił definicję na stronie edycji wyzwalacza, a ja po prostu edytowałem definicję 20-letnich wyzwalaczy, które były błędne - phpMyAdmin opuści się i ponownie uruchom wyzwalacz z nowym definicorem.

Inną opcją, którą znalazłem było wykonanie pełnego pliku mysqldump, edycja wynikowego pliku, użycie go do utworzenia nowej bazy danych, a następnie użycie narzędzia takiego jak Navicat do wykonania synchronizacji struktury z powrotem do oryginalnej bazy danych, wybierając tylko żądane wyzwalacze w wynikowa lista porównawcza. Był to dla mnie znacznie dłuższy proces, ponieważ musiałem tylko edytować 20 wyzwalaczy, ale gdybym musiał zaktualizować setki wyzwalaczy, byłby to szybszy proces.

+1

Można oczywiście edytować plik utworzony przez zrzut i dodać "wyzwalacz kropli, jeśli istnieje nazwa-triger; " – bartonlp

+0

Tak, ale to trochę więcej pisania. Gdybym nie miał dobrego narzędzia porównywania DB, to jak to zrobić. –

3

Bez użycia opcji --add-drop-wyzwalania:

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 
1

Innym podejściem jest użycie tego narzędzia Java. Uwaga: jest to praca w toku, ponieważ obecna wersja 1.0 usuwa niektóre zmienne serwera. newdef

0

Kolejna wariacja na temat wykorzystując opcję w MySQL Workbench jest zrzucić całą bazę danych przy użyciu „mysqldump” otwórz zrzut w zdolnej edytorze znaleźć zastąpić pożądanym „definiujący”, a następnie importować z MyQSL Workbench z opcja "Dump Structure Option" (v6.2) wybrana na ekranie importu.

Powiązane problemy