Mam DB, które sklonowałem, a teraz wszystkie wyzwalacze logowania wskazują tabele dziennika w oryginalnym schemacie. Muszę usunąć wszystkie za jednym razem (jest ich kilkadziesiąt), aby móc je odtworzyć. Jak to zrobić za pomocą jednego polecenia?Jak mogę usunąć wszystkie wyzwalacze w bazie danych MySQL za pomocą jednej instrukcji SQL?
Odpowiedz
To jest stare pytanie, ale ponieważ wciąż pojawia się w moich poszukiwaniach, pomyślałem, że wstawię tutaj rozwiązanie. W moim przypadku potrzebowałem utworzyć pojedynczy plik, który miał pełny mysqldump
, następnie upuszczałby wszystkie wyzwalacze, a następnie ponownie je wszystkie. Udało mi się to zrobić za pomocą poniższego polecenia, aby dołączyć oświadczenia DROP TRIGGER
do mojego zrzutu przed dołączeniem zrzutu wyzwalaczy.
mysql -u [db user] -p[db password] --skip-column-names [db name] -e 'SHOW TRIGGERS;' | cut -f1 | sed -r 's/(.*)/DROP TRIGGER IF EXISTS \1;/' >> dump.sql
Aby faktycznie spaść wszystkie wyzwalacze w tym samym poleceniu (jak wspomniano przez @Stephen Crosby w komentarzach), można po prostu rury to z powrotem do MySQL tak:
mysql -u [db user] -p[db password] --skip-column-names [db name] -e 'SHOW TRIGGERS;' | cut -f1 | sed -r 's/(.*)/DROP TRIGGER IF EXISTS \1;/' | mysql -u [db user] -p[db password] [db name]
Nie jestem pewien co do istnienia pojedynczego polecenia w tym celu.
Ale o to, jak to zrobiłem jakiś czas temu
- napisać skrypt do listy wyzwalaczy dostać w db.
- stworzyć listę Concated w dropTrigger.sql złożyć
- Run dropTrigger.SQL złożyć
Aby uzyskać listę wyzwalaczy można użyć SHOW trigger lub Triggers table in Information schema
Szybka odpowiedź brzmi "nie".
Ale można zamknąć logikę w jednej procedurze przechowywanej: uzyskać wszystkie wyzwalacze i usunąć wszystkie z nich w pętli przy użyciu dynamicznego SQL.
Po to można wykonać: call delete_all_triggers_api(schema_name);
Niestety nie jest to możliwe w regularnych SQL lub procedury przechowywanej.
Rozwiązanie
Najprostszym rozwiązaniem upuścić wszystkie wyzwalacze mogą być skrypt bash:
echo "select concat('drop trigger ', trigger_name, ';')
from information_schema.triggers where trigger_schema = 'your_database'" |
mysql --defaults-extra-file=.mysql.conf --disable-column-names |
mysql --defaults-extra-file=.mysql.conf
wymaga pliki poświadczenia (.mysql.conf
) tak:
[client]
database=your_database
user=your_username
password=your_password
Rozumowanie
Próba upuszczenia wyzwalacza z procedury składowanej zakończy się niepowodzeniem. Zgaduję, dzieje się tak dlatego zmienna może posiadać tylko ciąg i drop trigger
wymaga nazwy wyzwalania (nie łańcuch zawierający nazwę wyzwalania):
create procedure drop_a_trigger()
begin
declare var1 varchar(1024);
set var1 = "my_second_trigger";
drop trigger my_first_trigger; // OK
drop trigger address_update_before; // ERROR 1360 (HY000): Trigger does not exist
end //
delimiter ;
call drop_a_trigger();
Istnieją dwa wątki na ten temat na forach MySQL:
obaj dotrzeć do tego samego wniosku, że nawet przy użyciu zapisanego procedura nie pomoże.
Nie można użyć przygotowanej instrukcji z procedurą składowaną, aby usunąć wyzwalacz? – jcoffland
SELECT Trigger_Name
FROM `information_schema`.`TRIGGERS`
WHERE TRIGGER_SCHEMA = 'your_schema';
skopiuj wyniki do schowka
przekonwertuj Trigger_name
na DROP TRIGGER <trigger_name>;
dla każdego spustu za pomocą znaczników^i S dla początku i końca wiersza z wyrażeń reg.
Uruchom jako skryptu SQL
MAC przy użyciu MAMP:
Jest kilka drobnych poprawek, które muszą być wykonane z przyjętym odpowiedź dla nas. Najpierw musimy skierować mysql do MAMP. Po drugie, sed -r
nie działa na Macach, zamiast tego użyj sed -E
. Zakładając standardową konfigurację MAMP, bez zmian domyślnych ustawień użytkownika root, po prostu zamień [nazwa db] na swoją bazę danych, a następnie skopiuj i wklej do Terminalu i naciśnij enter.
/Applications/MAMP/Library/bin/mysql -u root -proot --skip-column-names [db name] -e 'SHOW TRIGGERS;' | cut -f1 | sed -E 's/(.*)/DROP TRIGGER IF EXISTS \1;/' | /Applications/MAMP/Library/bin/mysql -u root -proot [db name]
(jeśli zostały zaktualizowane hasła administratora, po prostu zamienić się „root” po -p
z hasłem
SELECT Concat('DROP TRIGGER ', Trigger_Name, ';') FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_schema';
Kopiuj i wklej wygenerowany sql
To zdecydowanie najlepsza odpowiedź. – user2831723
Gdzie byłeś przyjacielem? (y) – NullPointer
nie jest możliwe, aby usunąć wszystkie wyzwalacze w bazie danych MySQL za pomocą jednej instrukcji SQL
Ale z następującym kodem SQL można zbudować listę wszystkich statuentów "DROP TRIGGER" ts (zastąpienie <your_schema> ze swoją nazwą schematu, np. imię i nazwisko w bazie):
-- set `group_concat_max_len`
SET @@session.group_concat_max_len = @@global.max_allowed_packet;
-- select all the triggers and build the `DROP TRIGGER` SQL
-- replace <your_schema> with your schema name (e.g. your database name)
SELECT GROUP_CONCAT(sql_string SEPARATOR '\n')
FROM (
SELECT CONCAT('DROP TRIGGER IF EXISTS `', TRIGGER_NAME, '`;') AS sql_string,'1'
FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = '<your_schema>'
) AS sql_strings
GROUP BY '1';
Wynik poprzedniego zapytania będzie produkować coś takiego:
DROP TRIGGER IF EXISTS `trigger1`;
DROP TRIGGER IF EXISTS `trigger2`;
(...)
i można korzystać z tych SQL, aby ostatecznie usunąć wszystkie wyzwalacze.
Zmienna systemowa serwera group_concat_max_len jest maksymalną dozwoloną długością wyniku w bajtach dla funkcji GROUP_CONCAT(). Ponieważ domyślną wartością jest 1024, musimy ją zwiększyć, aby uniknąć obcinanego wyniku, jeśli mamy dużo wyzwalaczy. Po prostu użyłem wartości zmiennej systemowej serwera max_allowed_packet, ale zwykle jest w porządku każda duża liczba całkowita. Zobacz this other question.
W przypadku chcesz usunąć je za pomocą zapytania bez konieczności sqldump bazy danych do pliku:
select concat('drop trigger ', trigger_name, ';') from information_schema.triggers where trigger_schema = 'your_schema';
Następnie należy wyeksportować wyniki (znajdę do CSV najłatwiej) i uruchomić zapytań w tych wynikach.
- 1. Uzyskiwanie liczby pól w bazie danych za pomocą instrukcji SQL?
- 2. Jak usunąć wszystkie tabele w bazie danych MySQL?
- 3. Jak mogę usunąć wszystkie rekordy w bazie danych w CouchDB?
- 4. Jak mogę uruchomić plik tekstowy SQL w bazie danych MySQL?
- 5. Jak przechowywać obrazy w bazie danych mysql za pomocą php
- 6. Jak rozpoznać wyzwalacze powiązane z tabelą w bazie danych sybase?
- 7. Jak usunąć wszystkie tabele z bazy danych w SQL Server 2005 w instrukcji z wyjątkiem jednej tabeli
- 8. jak przechowywać wideo w bazie danych za pomocą mysql?
- 9. Czy mogę załadować wiele plików za pomocą jednej instrukcji wymagającej?
- 10. Jak usunąć wszystkie widoki z bazy danych mysql za pomocą komendy mysql query/command?
- 11. Zrzuć wszystkie klucze obce w bazie danych MySQL
- 12. Francuskie znaki w bazie danych MySQL
- 13. Jak przechowywać ostrzeżenia MySQL w bazie danych?
- 14. Jak usunąć wszystkie zdarzenia w MySQL
- 15. Jak mogę uzyskać wartości enum możliwych w bazie danych MySQL za pomocą php?
- 16. MySQL - ile wierszy mogę wstawić w jednej instrukcji INSERT?
- 17. Jak usunąć bazę danych mysql za pomocą polecenia powłoki
- 18. Jak usunąć wszystkie wiersze ze wszystkich tabel w bazie danych programu SQL Server?
- 19. Jak usunąć wszystkie klasy za pomocą jQuery?
- 20. Jak mogę usunąć wszystkie tabele z mojej bazy danych?
- 21. Jak usunąć łączniki za pomocą aktualizacji MySQL?
- 22. Wykonywanie wielu zapytań SQL w jednej instrukcji PHP
- 23. MySQL typ danych w bazie
- 24. ALTER wszystkie tabele w bazie danych
- 25. jak usunąć konkretną wartość kolumny samodzielnie w bazie danych postgresql?
- 26. W MySQL, jak mogę wsadowo zmieniać nazwy tabel w bazie danych?
- 27. Podgląd instrukcji SQL przed migracją za pomocą Flywaya
- 28. Flask-SQLAlchemy, jak usunąć wszystkie wiersze w jednej tabeli
- 29. Usunąć za pomocą QueryOver?
- 30. jak mogę usunąć wszystkie NewLine ze zmiennej w SQL Server?
Uwielbiam to.Ale równie dobrze możesz po prostu przekierować go z powrotem do mysql zamiast do pliku: Zamiast ">> dump.sql" możesz po prostu użyć "| mysql -u [db user] -p [db password]" –
To zależy bardzo dużo lub twój przypadek użycia. Dla mnie było to tworzenie pliku zrzutu z bazy danych niewolników, która służy do aktualizacji naszych baz danych deweloperów. To tylko część tego pliku zrzutu. Nie chciałbym tego uruchamiać w odniesieniu do naszego DB produkcyjnego, ale jest to część procesu aktualizacji lokalnej kopii DB produkcji dla rozwoju. Byłoby to jednak bardzo przydatne, gdybyś chciał uruchomić go w tej samej bazie danych. –
Należy pamiętać, że użytkownicy BSD i OS X będą musieli używać 'sed -E' zamiast' sed -r'. – nofinator