Dijeljenje tablica od dvije baze

Mislim da nema još ovog pitanja jer ga baš i nisam pronašao; pa me zanima ako je moguće dijeljenje tablica između baza tj.

Želim napraviti dvije MySQL baze sa svim tablicama istim tj imaju sve tablice iste, a želim da se sadržaj tablice user dijeli između te dvije baze, tj. ako se neko registrira u bazi 1 da je automatski dodan i u bazu 2 i obrnuto.?

U MS SQL-u je to “view”

Pogledaj ovdje

ono što mi pada na pamet jest, da na svaku bazu staviš proceduru u kojoj češ imati insert (za korisnike) i pozoveš te dvije procedure jednu za drugom s istim parametrima.

ako sam dobro shavio što želiš napraviti.

http://www.mysql.rs/2010/02/mysql-audit-data/

[quote=“trnac”]U MS SQL-u je to “view”

Pogledaj ovdje


[/quote]

to što pita, nema veze s pogledima.

njemu treba insert u bazu korisnika koji se logirao tj. u jednu i drugu bazu.

[quote=""]to što pita, nema veze s pogledima.

njemu treba insert u bazu korisnika koji se logirao tj. u jednu i drugu bazu. [/quote]

Ne logiro , registriro. ali da zvući zanimljivo, ako se neko registrira na bazi 1 da je insertan ( dodan ) i u bazu 2, samo da ne bi na kraju možda došlo do nekog izpremješanja?

zašto bi došlo?

ako u jednoj i drugoj imaš tablicu user, koja je jedna te ista, tj. ista po strukturi i podacima, ne vidim razloga strahu.

ako su baze na istom serveru.
onda staviš proceduru na drugu bazu i onda ispadne to ovako:

DELIMITER $$

CREATE PROCEDURE `proba1`.`unos`(IN p INT(9), IN z VARCHAR(20))
	
	
    BEGIN

	START TRANSACTION;
	INSERT INTO proba.osobe VALUES(p, z);
	INSERT INTO proba1.neka VALUES(p,z);
	COMMIT;

    END$$

DELIMITER ;

i u slučaju da jedna baza nije dostupna ili ne postoji, mysql će ti javit grešku i ništa se neće zapisati.
tablicu osobe sam obrisao i dobio ovo.

Query : call unos(6,'ivo') 
Error Code : 1146
Table 'proba.osobe' doesn't exist
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

Hvala, samo da pitam će se to automatski pokretat kod promjene ( tj. registracije i dodavanja podataka ) baze ili ću to ja morat pokretat?

ti pozivaš proceduru s tim parametrima.

call mojaprocedura(parametar1, parametar2)

automatski ako hočeš onda na trigere.

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `proba1`.`unos` BEFORE INSERT
    ON `proba1`.`neka`
    FOR EACH ROW BEGIN
	DECLARE i INT;
	DECLARE j VARCHAR(20);
	SELECT ID,ime INTO i,j FROM neka WHERE neka.ID=NEW.ID;
	INSERT INTO proba.osobe(ID,ime) VALUES(NEW.ID,NEW.ime);
    END$$

DELIMITER ;

na svaku bazu dodaš ovakav triger, pa ako osoba upiše u jednu bazu, bit će automatski i u drugoj bazi.
samo pazi na ID-e.
ako su 10 korisnika, 5 ih upisuje u jednu, a 5 u drugu.
ovo nema veze ako ti ne treba ID, između jedne i druge jer neće biti isti.

ovo radi tako kad uneseš u tablicu druge baze, bit će automatski upisano i u prvoj.

ako češ staviti ovakav triger na prvu bazu, onda promijeni ono što moraš u ovom code-u.
i radit će ti obostrano.

ako ti treba update
stavi before update.
ako ti treba delete, stavi delete.
i pretražuj po imenu korisnika, a ne po ID-u ako češ koristiti trigere za brisanje ili update.

samo pazi, svaki query u trigeru je ravnopravan query-u na bazi.

to je isto kao da imaš dva query-a select i insert.

[quote=“Dragon”]Mislim da nema još ovog pitanja jer ga baš i nisam pronašao; pa me zanima ako je moguće dijeljenje tablica između baza tj.
[/quote]
E bio sam ja postavio ovo pitanje, nakon silnog istraživačkog rada (:))došao sam do zaključka da je to nemoguče. Moguče je koristeći replikaciju, ako se ne varam, no to su “napredna” pitanja.

Moguča su naravno predložena “zaobilazna rješenja”, no ja bih ti predložio da kreiraš još jednu bazu i u njoj držiš podatke o userima, to nisam isprobao pa neznam sideeffekte:cuga2: A možda je i zato već kasno.

Možda da manipulaciju korsnicima držiš u aplikaciju jer ovako igranje “ping ponga” između baza, neznam koliko je kvaliteno. No ako drugog rješenja nema, onda što se mora nije teško:).

[quote=“Lola”]to što pita, nema veze s pogledima.

njemu treba insert u bazu korisnika koji se logirao tj. u jednu i drugu bazu.[/quote]

Ne, to se kroz view nikako ne može napraviti i ja trtljam bez veze…

Ili se to ne može u MySql bazi? :zub:

[quote=“Lola”]ti pozivaš proceduru s tim parametrima.

call mojaprocedura(parametar1, parametar2)

automatski ako hočeš onda na trigere.

na svaku bazu dodaš ovakav triger, pa ako osoba upiše u jednu bazu, bit će automatski i u drugoj bazi.
samo pazi na ID-e.
ako su 10 korisnika, 5 ih upisuje u jednu, a 5 u drugu.
ovo nema veze ako ti ne treba ID, između jedne i druge jer neće biti isti.[/quote]

I mislio sam na ID kad sam reko dal bi bilo kakvih problema, nego daj mi smao reci što ti je kaj u ovom kodu proba proba1, nekej …

Sorry ako sam dosadan ali ne znam u mysql-u pa zato pitam :smiley:

[quote=“trnac”]Ne, to se kroz view nikako ne može napraviti i ja trtljam bez veze…

Ili se to ne može u MySql bazi? :zub:[/quote]

Nisam 100% ali mislim da u mysql insert u view ne ide.

[quote=“trnac”]Ne, to se kroz view nikako ne može napraviti i ja trtljam bez veze…

Ili se to ne može u MySql bazi? :zub:[/quote]

view ili pogled je samo read only, koji se kreira kao neki select from nešto.

to vrijedi za bilo koju bazu.

postoji materialized view (oracle ima, sql server ima ali na pola, mysql nema, postgresql nema, firebird nema, za ostale neznam)

view se koristi kad želiš sakriti strukturu baze pa pripremiš query-e i iz njih radiš jednostavan select i služi kao filter.

[quote=“Dragon”]I mislio sam na ID kad sam reko dal bi bilo kakvih problema, nego daj mi smao reci što ti je kaj u ovom kodu proba proba1, nekej …

Sorry ako sam dosadan ali ne znam u mysql-u pa zato pitam :D[/quote]

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `proba1`.`unos` BEFORE INSERT
    ON `proba1`.`neka`
    FOR EACH ROW BEGIN
	INSERT INTO proba.osobe(ID,ime) VALUES(NEW.ID,NEW.ime);
    END$$

DELIMITER ;

select ne treba, prvo sam mislio ovako, ali ne treba.ovo je dovoljno.

proba1 je baza2.
proba1.unos je ime trigera
proba je baza1
"osobe" -> tablica u bazi1
a u trigerima se barata sa NEW i OLD.
NEW je nova vrijednost koja se ubacila, a OLD stara vrijednost koja već postoji u bazi.

ako je sdruga baza na nekom drugom serveru onda ovo ne prolazi.

jer mysql ne podržava "insert into server.baza.tablica values(bla,bla)

podržava insert na istom serveru.

za nadobudne

ovo je view

DELIMITER $$

USE `proba1`$$

DROP VIEW IF EXISTS `prva`$$

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `prva` AS 
SELECT
  `neka`.`ID`  AS `ID`,
  `neka`.`ime` AS `ime`
FROM `neka`$$

DELIMITER ;

kad ja napravim
INSERT INTO prva VALUES(8,‘tt’)
on mi ubaci u tablicu “neka”, vrijednosti.

međutim, ovo raditi je čista glupost.
znači nije read only kao što sam rekao gore.

čitam manual, to je sad novi features u mysql-u 5.x verziji.

[quote=“Lola”]view ili pogled je samo read only, koji se kreira kao neki select from nešto.

to vrijedi za bilo koju bazu.[/quote]

Ako želiš, možeš probati ovo. Kreiraj dvije baze na MS SQL Serveru.
BAZA1 ima tablicu LOLA (POLJE VARCHAR(100)), a druga ima view LOLA kao ovo:

use BAZA2
go

CREATE VIEW LOLA
AS
SELECT *
FROM BAZA1.dbo.LOLA

Napravi insert

use BAZA1
go
INSERT INTO LOLA (‘insert from BAZA1’)
go

use BAZA2
go
INSERT INTO LOLA (‘insert from BAZA2’)
go

probaj u bilo kojoj bazi

SELECT * FROM LOLA

Kada probaš napiši što si dobio kao rezultat. TNX

[quote=“trnac”]Ako želiš, možeš probati ovo. Kreiraj dvije baze na MS SQL Serveru.
BAZA1 ima tablicu LOLA (POLJE VARCHAR(100)), a druga ima view LOLA kao ovo:

use BAZA2
go

CREATE VIEW LOLA
AS
SELECT *
FROM BAZA1.dbo.LOLA

Napravi insert

use BAZA1
go
INSERT INTO LOLA (‘insert from BAZA1’)
go

use BAZA2
go
INSERT INTO LOLA (‘insert from BAZA2’)
go

probaj u bilo kojoj bazi

SELECT * FROM LOLA

Kada probaš napiši što si dobio kao rezultat. TNX[/quote]

napisao sam gore da radi, to je novi features u mysql-u.
ali zašto to raditi?

ne vidim smisla?

[quote=“Lola”]napisao sam gore da radi, to je novi features u mysql-u.
ali zašto to raditi?

ne vidim smisla?[/quote]

Napisao si dok sam ja pisao svoju litaniju.
Smisao je bio da te razuvjeri u tvojoj tvrdnji.

[quote=“trnac”]Napisao si dok sam ja pisao svoju litaniju.
Smisao je bio da te razuvjeri u tvojoj tvrdnji.[/quote]

pogledaj vrijeme poruka.
a za promjene imaš 10 minuta od prvog spremanja.

tvoja poruka u 21:36
moja u 21:22.

sory, nisam znao da to postoji, ali svrha postojanja view-a je filtriranje, jednostavni select iz view-a (view sadrži kompleksni query) i sakrivanje strukture baze.

ja ako pogriješim priznam, pogriješio sam.

[quote=“Lola”]pogledaj vrijeme poruka.
a za promjene imaš 10 minuta od prvog spremanja.

tvoja poruka u 21:36
moja u 21:22.

sory, nisam znao da to postoji, ali svrha postojanja view-a je filtriranje, jednostavni select iz view-a (view sadrži kompleksni query) i sakrivanje strukture baze.[/quote]

Misliš da ja svako malo gledam jesi li ti nešto napisao i onda kada napišem roman da samo tako lako odustanem od njega jer si ti proučio dokumentaciju? :slight_smile:

Ma nema frke. Tu smo da idemo naprijed. Meni view koristi za “dijeljenje” tablica između baza.
Ja kada pogriješim nikad ne priznam jer i ako priznam, još uvijek mi pola krivice ostane. :zub:

ali ako imaš ovakav slučaj kao što je postavljeno pitanje, onda je jednostavnije na trigere i ne moraš raditi view ni insert, nego triger to radi za tebe.

ili ako hočeš može i procedura.

to je moje mišljenje i tako mi je jednostavnije.