Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Trigger - jak wykonac - dla MyBB.
calif
post 4.09.2010, 15:41:34
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
everth
post 4.09.2010, 17:13:22
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.
  1. CREATE VIEW `mybb1_users` AS SELECT * FROM `mybb_users`;


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
calif
post 4.09.2010, 21:48:30
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
Go to the top of the page
+Quote Post
everth
post 4.09.2010, 21:54:56
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]!
Go to the top of the page
+Quote Post
cojack
post 4.09.2010, 22:21:59
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Widok nie jest aliasem, tylko interfejsem.

Podany przykład nie robi tego czego oczekiwałeś.

Musisz utworzyć trigger:

  1.  
  2. CREATE FUNCTION "insertNewUsersToOtherUserTablesFunction" RETURNS TRIGGER AS $BODY$
  3. DECLARE
  4. "__row" RECORD;
  5. BEGIN
  6. SELECT
  7. *
  8. INTO
  9. "__row"
  10. FROM
  11. "mybb_users"
  12. WHERE
  13. "user_id" = NEW."user_id"; -- czy jak tam sie kolumna nazywa
  14.  
  15. INSERT INTO "mybb_users1" SELECT * FROM "__row";
  16. INSERT INTO "mybb_users2" SELECT * FROM "__row";
  17. -- i tak dalej...
  18.  
  19. RETURN NEW;
  20. END;
  21. $BODY$ LANGUAGE 'plpgsql';
  22.  
  23. CREATE TRIGGER "insertNewUsersToOtherUserTablesTrigger"
  24. AFTER INSERT ON "mybb_users"
  25. FOR EACH ROW EXECUTE PROCEDURE "insertNewUsersToOtherUserTablesFunction"();


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
Go to the top of the page
+Quote Post
everth
post 4.09.2010, 22:30:41
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]!
Go to the top of the page
+Quote Post
cojack
post 4.09.2010, 22:36:24
Post #7





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post
everth
post 4.09.2010, 23:02:29
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

questionmark.gif Przecież to są prefiksowane tabele (przynajmniej ja tak to zrozumiałem). Kod musiałby poprawiać (choć nie grzebałem w bebechach myBB) gdyby postawił 20 skryptów i chciał się z nich odwoływać do jednej tabeli 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]!
Go to the top of the page
+Quote Post
calif
post 4.09.2010, 23:14:35
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ć? smile.gif

Nigdy nie zajmowałem się w ten sposób bazami danych, dlatego takie noobskie pytania
Go to the top of the page
+Quote Post
cojack
post 5.09.2010, 08:36:33
Post #10





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post
calif
post 5.09.2010, 11:29:04
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?
Go to the top of the page
+Quote Post
cojack
post 5.09.2010, 14:34:45
Post #12





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post
everth
post 5.09.2010, 17:15:55
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]!
Go to the top of the page
+Quote Post
calif
post 5.09.2010, 19:07:40
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!
Go to the top of the page
+Quote Post
everth
post 5.09.2010, 21:01:21
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]!
Go to the top of the page
+Quote Post
calif
post 7.09.2010, 18:52:47
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ąć.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 16:43