Zjištění zda záznam je smazatelný rubrika: Databáze: SQL

12 rmaslo
položil/-a 26.6. 15:15
 
upravil/-a 27.6. 1:28

Zdravím,
Zajímalo by mě zda existuje nějaká db (předpokládám nějakou hodně pokročilou typu Oracle atd...), která je schopna vrátit informaci o tom, zda daný záznam je pro daného uživatele smazatelný. Mám na mysli, že si zjistí, zda je tento záznam použit v nějakých jiných tabulkách jako cizí klíč, pokud je povoleno mazání v kaskádě tak zjistí zda to nezakáže něco jiného v té kaskádě, samozřejmě zjistí zda to není zamezeno tím, že uživatel nemá právo mazat záznamy v nějaké další tabukce z té kaskády atd...

Ta db si to stejně musí zjišťovat v okamžiku mazání, takže by to měla umět zjistit docela rychle.
Chápu, že principiálně bych si to mohl zjistit z INFORMATION_SCHEMA - projít všechny relace k příslušné tabulce, zkontrolovat zda jsou navazující záznamy, pokud ano, jestli se mažou v kaskádě či ne, pokud se mají mazat v kaskádě tak zda na to jsou práva... Nicméně pokud bych to dělal takto ručně třeba pro 50 záznamů na stránce (a podle toho vyhreslil ikonu pro mazání) tak by to asi nebylo nejrychlejší.


2018-06-27 01:20 Doplnění k čemu to je:
Představme si že mám třeba seznam firem. U těchto firem chci udělat mazací ikonu (třeba kvůli GDPR). Primární klíč z firmy je cizím klíčem v tabulce lidi, kde je kaskádovité mazání (smazání firmy smaže i příslušné lidi). A pak tam mám třeba tabulku faktury, kde je také cizí klíč do firmy, ale kaskádové mazání tam samozřejmě není, protože naopak existence faktury zabrání smazání firmy. Samozřejmě, že pro faktury a lidi to lze "ručně zjistit", ale já do budoucnu očekávám, že se tam budou časem přidávat další tabulky kde bude cizí klíč na firmy. A to jak takové, které smazání firmy zabrání (třeba smlouvy) tak takové, kde bude kaskádové mazání (třeba adresy). K tomu "výpočtu" zda tam mazací ikona je nebo ne se mi nechce furt vracet a něco tam dopisovat. Proto bych chtěl vyjít ze schématu db.
A zajímalo by mě jestli se takováto funkcionalita typicky programuje ručně (z information_schema to určitě zjistit jde) nebo jestli na to nějaké db mají nástroje. Třeba by některá db mohla být tak chytrá, že když dám EXPLAIN DELETE FROM firmy WHERE id = xxx mohla říct, že to nejde.

Komentáře

  • harrison314 : Nie celkom chapem, co si chcel povedat, ale ak to, ze vymazes riadok ine tabulky ho stale pouzivaju ako cudzie kluce, tak to by sa ti hlavne nemalo podarit kvoli cudzim klucom (napr. MS SQL to defaultne nedovoluje). A myslim to je jadro toho problemu, nedodrzanie konzistencie... 26.6. 19:57
  • Kit : Někdy je vhodné ve vstupním formuláři vyznačit položky, které je možné odstranit, například nepoužité kategorie zboží. Ovšem na tyto kategorie může navazovat i jiná tabulka, například objednávka. V INFORMATION_SCHEMA to všechno je, ale vyzobávání je pracné. 26.6. 17:32
  • harrison314 : Niekedy to potrebne je, ale vtedy sa to neriesi, ze nieco zmazem a inde mi zostanu cudzie kluce OMG. Riesi sa to castom platnostoi od-do, alebo bool stpcom (IsDeleted, Enabled,... a podobne). 26.6. 19:58
odkaz
8 podhy
odpověděl/-a 27.6. 12:22
 
upravil/-a 27.6. 12:30

ne nejde to a nepomůže ti k tomu ani katalog, protože mazání resp. nemazání mohou ovlivňovat triggery....částečně to vyřešíš projitím katalogu a kontrolou dat (jak zmiňuješ), ale obecně to fungovat nebude

EDIT: tohle by byla krásná úloha pro rekurzivní dotazy

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.