Autor Zpráva
d.b.cooper
Profil *
Zdravím
dnes jsem narazil v DB na 'pohledy' našel jsem si že se základní pohled vytvaří

create view novyPohled
as
select * from mojeTabulka; 

ale nenašel jsem možnost je v phpmyadminovy editovat navíc je to pohled do jiné DB jak se řeší pžipojení ? ...

1) mohl by mi někdo prosím napsat přiklad pohledu i s připojením ?
2) jednou vytvoreny pohled už nelze editovat ?

předem díky za info

Moderátor juriad: Vkládej do [pre] jen zdrojové kódy; děkuji.
juriad
Profil
d.b.cooper:
Pohled je pojmenovaný SELECT. V MySQL je možné vytvářet pohledy jen uvnitř jednoho databázového serveru (nikoli tedy připojením k jinému), může se však odkazovat na tabulky v jiné lokální databázi.

Pohled slouží k zjednodušení zápisu dotazů. Představ si, že máš tabulku produktů v eshopu a produkty průběžně přibývají a mizí. Chceš tedy nabízet jen aktuální produkty, ale v databázi stále chceš mít informaci o těch již neprodávaných (třeba pro účely faktur a reklamací).
Vytvoříš si tedy pohled:
CREATE VIEW current_products AS
SELECT * FROM products WHERE archived = 0;
A ten budeš používat v dotazech místo tabulky products.
Tedy třeba takto a už se nemusíš zabývat těmi archivovanými:
SELECT * FROM current_products WHERE price > 1000;

Z tohoto důvodu nelze pohled editovat. Nemá to smysl - je to aktuální pohled na data v jiných tabulkách. Měnit jej by znamenalo měnit data v původních tabulkách (některé databáze, včetně MySQL to za určitých podmínek umožňují). Měnit definici VIEW lze pomocí příkazu ALTER VIEW ..., viz dokumentace.

Příklad s použitím tabulky v jiné databázi je triviální, jen napíšeš před název tabulky název databáze (kvalifikuješ název tabulky).
Máš-li v DB1 tabulku T1 a v DB2 také tabulku T1 (chci jen ukázat shodu jmen), tak můžeš vytvořit view v DB1 obsahující řádky, které jsou v obout tabulkách:
CREATE VIEW DB1.spolecne AS
SELECT d1t1.* FROM DB1.T1 AS d1t1 JOIN DB2.T1 AS d2t1 ON d1t1.id = d2t1.id;
Zvýrazněné části nejsou nutné pokud view vytváříš v kontextu dababáze DB1; je lepší je tam však psát pro přehlednost.
d.b.cooper
Profil *
děkuju za vysvětlení vážím si tvého času :) jen bych potřeboval ještě pár věcí ujasnit

k 1) mam troje přihlašovací údaje (databaze pro web [tabulky webu], databaze pro statistiky [tabulky statistik pro více webů včetně mého], třetí přístup kde jsou všechny databáze [mám ho používat pro přístup přes phpmyadmina ... vidím hned vše nemusím se přepínat a je na moje jméno tudíž je přehled co kdo udělal ...] )

ale pokud se přihlásím prvním připojením (přes phpmyadmina což bych neměl ... ale je to tak v configuraci webu) vidím pohled do druhé databáze ale jak to jelikož tenhle účet přece nemá práva vidět do téhle DB ... ?

(respektive to můžu na velkém servru (třeba nějaký hosting) kde mám pronajatý malý prostor se zkoušet připojovat do prostoru jiných uživatelů ... ? ...)

2) problém ani není tak že pokud pohled napíšu špatně a chci ho opravit musím ho smazat a napsat znovu ... spíš mě vadí že se nemůžu (jako laik :) ) podívat editací jak byl pohled napsán zvlášť když sem ho nevytvářel jak pak můžu vědět co je tam nastaveno za podmínky ...
juriad
Profil
d.b.cooper:
1) Právě jsem to vyzkoušel; jako uživatel root jsem vytvořil view napříč dvěma DB. Více viz níže.

2) Můžeš spustit příkaz:
SHOW CREATE VIEW <název-view>;
To ti ukáže jeho definici.

Například pro view vytvořené jako (pro dvě pokusné tabulky, které jsem někde vyšťoural):
create view a as
select ud.*, username from udalosti ud join test.users us on ud.id = us.id;
to vypíše:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `a` AS select `ud`.`cas` AS `cas`,`ud`.`name` AS `name`,`ud`.`id` AS `id`,`us`.`username` AS `username` from (`pokus`.`udalosti` `ud` join `test`.`users` `us` on((`ud`.`id` = `us`.`id`)))
Tady si můžeš všimnout, že je definováno, jako který uživatel se dotaz bude provádět. Vyznačené části znamenají, že view se bude provádět jako uživatel, který jej definoval a tím je lokální root. Podrobnosti jsou v dokumentaci.
juriad
Profil
Ještě doplním, že VIEW lze takto krásně použít pro sdílení tabulek mezi databázemi. Prostě jej založí uživatel, který má práva na obě databáze a všichni ostatní jej mohou používat. Toto VIEW pak bude definované triviálně jako:
SELECT VIEW tabulka AS
SELECT * FROM JINA_DB.tabulka;
Pro přehlednost bude název view stejné jako název vzdálené tabulky. Všechny dotazy pak mohou používat toto view, jakoby to byla tabulka.
d.b.cooper
Profil *
tak se omloiuvam 1) je vyřešená opravdu to nejde a to byl důvod proč jsem se o to celé začal zajímat :) web byl přesunut a databáze rozděleny proto mi to nefungovalo i když jsem sql dotaz zkopíroval do mého "třetího" přihlášení v phpmyadminu kde to samozřejmě šlo ...
d.b.cooper
Profil *
neměl jsem refreshnuto ... každopádně přínosné informace díky :)
jinak 2) nenapadlo mě že jde udělat exportem popřípadě v mé verzi phpmyadminu je pod výpisem sloupců v záložce "struktura" přehlídnutelný odkaz "Upravit pohled" ...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0