![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Potrzebuję Trigger'a (chyba tak to się nazywa), który robiłby taką coś: Gdy ktoś rejestruje się na forum MyBB - czyli zostaje dodany rekord do tabeli mybb_users, trigger reaguje i dopisuje tego samego użytkownika (rekord) do innej tabeli. Tak, abym mógł zainstalować większą ilość for na jednej bazie danych, aby na wszystkich forach byli Ci sami użytkownicy. Przypuśćmy jedna tabela z ludźmi to: mybb_users, a druga to mybb1_users, kolejna mybb2_users itp. itd. Jak to zrobić? Pozdrawiam! calif |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy jest to rozwiązanie ale chyba oszczędniej będzie to zrobić tworząc aliasy dla mybb_users za pomocą widoków, np.
-------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie! Daję punkt.
Działa. @Down, dzięki za odp. już sprawdziłem. Pozdrawiam! Ten post edytował calif 4.09.2010, 21:56:45 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Niepotrzebna - potrzebujesz jednej tabeli - mybb_users, przy założeniu że wszystkie skrypty operują na tabeli o takiej samej strukturze. Tutaj jest tylko jedna tabela - widoki są niejako aliasami. Przetestuj to sobie najpierw, bo widoki nie są pełnoprawnymi tabelami i może to nie być do końca stabilne (choć wydaje mi się że powinno śmigać bez problemu).
-------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Widok nie jest aliasem, tylko interfejsem.
Podany przykład nie robi tego czego oczekiwałeś. Musisz utworzyć trigger:
To jest przykład dla postgresa, nie znam procedur w mysql, ale analogicznie będziesz mógł napisać swoją. Nie zapomnij że po każdej takiej sytuacji będziesz musiał w każdej tabeli ustawić na nowo seq klucza głównego. Ten post edytował cojack 4.09.2010, 22:22:39 -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Podany przykład nie robi tego czego oczekiwałeś. @cojack możesz rozwinąć? Używając triggerów musi pozakładać je na każdej nowej tabeli user w każdym skrypcie forum (zakładając że wszystkie muszą się synchronizować). Przy każdej rozbudowie czegoś takiego o nowe forum musi modyfikować wyzwalacze na każdej tabeli poprzedniej. To nie jest wygodne. -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Pytanie jak zrobić:
Gdy ktoś rejestruje się na forum MyBB - czyli zostaje dodany rekord do tabeli mybb_users, trigger reaguje i dopisuje tego samego użytkownika (rekord) do innej tabeli. Odpowiedź: CREATE VIEW `mybb1_users` AS SELECT * FROM `mybb_users`; Ty idiotę ze mnie robisz czy mi się tylko wydaje? @edit i co chłop każdą linijkę w kodzie, w każdym forum będzie zmieniał z mybb_users na mybb1_users? A co przy kluczach obcych, będą się do widoku odwoływać? Ten post edytował cojack 4.09.2010, 22:37:58 -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Cytat i co chłop każdą linijkę w kodzie, w każdym forum będzie zmieniał z mybb_users na mybb1_users ![]() Właśnie dlatego napisałem żeby sobie to dokładnie przetestował. To jest proteza, a nie rozwiązanie. Tak samo protezą jest zastosowanie wyzwalaczy - te ostatnie trudno rozbudować, a w przy widokach nie działa praktycznie nic poza prostym CRUDem. Choć akurat o kluczach rzeczywiście nie pomyślałem w tym wypadku. -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Niestety everth, gdy rejestruję na forum które działa na mybb_*, uzytkownik nie pokazuje sie na drugim forum z mybb1_*.
cojack, uzywam mysql, ale Twoje rozwiązanie chyba pasuje. Gdzie mam to "dać", wpisać? ![]() Nigdy nie zajmowałem się w ten sposób bazami danych, dlatego takie noobskie pytania |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
No jak to gdzie, wrzuć to do phpMyAdmin i wykonaj jako zapytanie SQL.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
cojack, czyli to przy kazdym zarejestrowaniu czy to do tabeli mybb_users, mybb1_users, czy też mybb2_users, zapisze do wszystkich tych 3 tabel jeden rekord (użytkownika) tak?
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Tak dokładnie, tylko nie zapominaj o sequence. Należy zaktualizować i ustawić na następną wartość.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
@cojack - nie
Jeśli założysz te wyzwalacze na każdą modyfikowaną tabelę to gwarantuje ci że każde zapytanie na nich zwróci ci błąd. Choćby dlatego że procedura będzie próbowała zmodyfikować tabelę na której został postawiony wyzwalacz. Z kolei modyfikowanie każdego wyzwalacza osobno by modyfikował wszystkie sąsiednie tabele jest trochę bez sensu. Trochę sobie to przetestowałem i wyszło mi że najwygodniejszym rozwiązaniem będzie łańcuchowanie zdarzeń - czyli dla 3 tabel - modyfikacja np. tabeli 2 wyzwala akcję na tabeli 3, tabela 3 na 1 - 1 sprawdza że rekord istnieje na 2, więc łańcuch się kończy. Każdy insert,update,delete jest propagowany na sąsiednie tabele dzięki czemu powinny one zachować spójność. Dla większej ilości tabel triggery można generować np. za pomocą PHPa. Pozostaje pytanie o wydajność takiego rozwiązania. Przykładowe wyzwalacze na insert dla 3 tabel - tu. -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
everth, wysłałeś mi kod dla 3 tabel, gdy zostaje dodany użytkownik, a gdy zostaną zmodyfikowany użytkownik, albo usunięty? Też będzie to działać?
A jeśli byś mógł, to powiedz jak wyobrażasz sobie takie coś dla 5 tabel (bo tak będzie w moim przypadku), mogłbyś przedstawić kod do owej operacji? Pozdrawiam! |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Tworzysz wyzwalacze dla AFTER DELETE, AFTER UPDATE. Wzorzec masz. Do wygenerowania i zarządzania triggerami dla większej ilości tabel możesz sobie napisać jakiś skrypt (np. w PHPie). Jedyne co zmieniasz to nazwy triggerów i tabel na których operują. Pamiętaj żeby dla triggera AFTER DELETE zmienić warunek z IF NOT EXISTS na IF EXISTS.
Jak chcesz dodać nową tabelę to oznacz sobie sobie trigger na ostatniej tabeli np. dopiskiem last - wtedy przy dodawaniu kolejnej tabeli do konfiguracji po prostu usuwasz go usuwasz (tabela ostatnia staje się przedostatnią). Rekonstruujesz triggery na dwóch ostatnich tabelach - tak żeby przedostatnia wskazywała na ostatnią, a ta z kolei na pierwszą (wtedy na ostatniej jest trigger last). Przy usuwaniu tabeli z czegoś takiego musisz zrekonstruować wskaźnik na tabeli poprzedzającej by wskazywał na właściwą (czyli jak mamy 1->2->3->1 i usuwamy 2, to ma być 1->3->1). To jest coś jak lista jednokierunkowa. Tu masz wszystko o triggerach w MySQL. -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję bardzo.
Pomogliście mi bardzo. Temat można zamknąć. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 16:43 |