MySQL, databáze pro uložení uživatelských práv jako v linuxu
Ahoj
Dělám MySQL databázi pro aplikaci. Mělo by to být podobně jako v linuxu (ve win je to asi stejně).
Uživatel je vždy ve své vlastní skupině (1:1, mají stejné jméno), ale může se přidat i do jiné "neuživatelské" skupiny (např. moderátoři), uživatel může být ve více skupinách.(M:M)
Každá skupina vlastní i "neuživatelská" mají uložena nějaká oprávnění pro různé akce v aplikaci (to asi nemá vliv na funkčnost)
V tabulce 'files' jsou uložené soubory, každý soubor by měl mít uživatele a skupinu a práva (vlastník/skupina/ostatní, rwx/rwx/rwx)
mám tedy tabulku 'user' (kromě id, jmena.. tam jsou i opravneni vlastni skupiny), v tabulce 'role' jsou jen "neuživatelské" skupiny, pak mám vazební tabulku 'membership' jsou v ni jen dva primární a zaroveň cizí klíče userID, roleID
když chci do tabulky 'files' dát cizí klíč userID, je to ok, chci přdat cizí klíč roleID a už to nejde
chyba: SQL Error (1005): Can't create table 'databaze.#sql-634_4' (errno: 150) Foreign key constraint is incorrectly formed
když chci přidat místo dvou sloupců user, role přidat jen jeden sloupec s cizím klíčem z tabulky 'membership', vyskakuje stejná chyba (a to i když referenci na oba klíče userID, roleID nebo jen na jeden)
Nevím co s tím nebo jak to změnit :(
Zrejme mas v tabulce neco, co brani nastaveni constraintu. V RoleID je hodnota, ktera neni v tabulce neuzivatelskych skupin
Máte pravdu, měl jsem tam jiný datový typ.
Děkuji za rychlou odpověď.
Chtěl bych se ještě zeptat je dobrý nápad mít vlastní role v tabulce user a neuživatelské zvlášť v tabulce role?
Nebo je lepší dát je do jedné tabulky a pak provazovat přes vazební tabulku?
podle mě to máš úplně špatně, protože nemáš normalizovány tabulky (edit: a dříve či později to bude proklínat, protože narazí na omezení, daná špatným návrhem datového modelu).
udělej si:
- tabulku čistě user s user_ID jako primárním klíčem (můžeš přidat pole s položkou "primary_group" do které uložíš group_id primární skupiny)
- tabulku group s primárním klíčem Group_ID
- tabulku group_members, která bude pivot tablicí mezi user_id a group_id
- tabulku rolí tedy můžeš zcela vypustit, nebo do ní přidat aplikační logiku a navázat ji na tabulku "group" - to závisí na objemu těch rolí
takhle jsem to předělal, zkusil jsem ještě do user přidat primary_group a jako FK gId z groups, ale háže mi to chybu
asi to už nepujde svázat, myslel si to tak že by primary_group byl bez referncí?
SQL Error (1452): Cannot add or update a child row: a foreign key constraint fails (`databáze`.`#sql-634_4`, CONSTRAINT `FK_user_groups` FOREIGN KEY (`uPrimaryGroup`) REFERENCES `groups` (`gId`))
hoď sem dump databáze a selekt
Stačí tohle?
Chtěl sem tam přidat do User sloupek primaryGroup s referencí groups.gId, ale hláška viz předchozí post.
a to pole v User máš oindexované? (protože já v tom dumpu to pole vůbec nevidím..)
v tom dumpu to není
když tam přidám do user:
tak to nefunguje, viz hláška nad
spíš si myslím že když mám user->membership<-groups, tak že už nejde přidat reference mezi user->groups
ale constraint je přece jen integritní omezení, to není relace! - podle mně stačí vyhodit kaskádové aktualizace a mazání (reálně nevidím důvod proč to tam mít, protože samotné změny bys měl dělat vlastním selectem), tam by problém být mohl.
(přiznám se, že MySQL nepoužívám a neznám, takže se možná pletu)
zkusil jsem dát kaskády pryč ale pořád to samé