Lad os sige at vi i tabellen columns_priv har følgende rækker: host = % db = gooky1 user = gooky table_name = table1 column_name = kolonne1 column_priv = \'Select\', \'Insert\', \'Update\'
host = % db = gooky1 user = gooky table_name = table1 column_name = kolonne2 column_priv = \'Select\', \'Insert\'
host = % db = gooky1 user = gooky table_name = table1 column_name = kolonne3 column_priv = \'Select\'
host = % db = gooky1 user = gooky table_name = table1 column_name = kolonne4 column_priv = null
Det hele kan foregå fra hvilken som helst host, med mindre adgang er begrænset af db, host eller user tabellen. De fire privilegie definitioner gælder for bruger gooky, i forbindelse med tabellen table1 i databasen gooky1.
- Til kolonne 1 har brugeren rettigheder til at kører SELECT, INSERT og UPDATE kommandoer. - Til kolonne 2 har brugeren rettigheder til at kører SELECT og INSERT kommandoer. - På kolonne 3 kan brugeren kun kører SELECT kommandoer. - Og kolonne 4 har brugeren overhovedet ikke rettigheder til.
OK, for at tage det helt fra bunden. Jeg har en bruger kaldet baren, der skal have adgang til en database kaldet herlevkollegiet.
I den database ligger der ca 10 tabeller, men han skal KUN have adgang til tabellen bardatoer, samt 2 kolonner fra tabellen person. Jeg har lavet følgende SQL sætninger: OPRET BRUGER: insert into user values(\'localhost\',\'baren\',PASSWORD(\"skidegodt\"),\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\');
OPRET ADGANG TIL DATABASEN insert into db values(\'localhost\',\'herlevkollegiet\',\'baren,\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\');
OPRET ADGANG TIL TABELLEN BARDATOER: insert into tables_priv(host,db,user,table_name,grantor,table_priv,column_priv) values(\'localhost\',\'herlevkollegiet\',\'baren\',\'bardatoer\',\'root@localroot\',15,15);
OPRET ADGANG TIL 2 KOLONNER FRA TABELLEN PERSON: insert into columns_priv(host,db,user,table_name,column_name,column_priv) values(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'fornavn\',15),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'efternavn\',15),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'gammeladresseID\',0),,(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'foedt\',0),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'vaerelsenr\',0),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'ind\',0),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'ud\',0),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'behandlet\',0),(\'localhost\',\'herlevkollegiet\',\'baren\',\'person\',\'uddannelseID\',0);
Med dette skrevet så kan jeg IKKE se tabellen person. Jeg har sørget for at give alle(altså alle de kolonner der i tabellen) kolonnerne deres specifikke rettigheder(også selvom de ikke skal have nogen, hvilket jo er default) i tabellen person.
Der er noget jeg er usikker på og det er grantor i tabellen tables_priv. Jeg ved ikke om det kan give udslaget.
hmmm du kan vel bruge grant: ------------------------------------------------------ Grant Select On dbo.tabelnavn(kolonne) To public Go ------------------------------------------------------
forklaring: Grant Select --> her kan du grante enten update, delete eller select To public --> her kan skrive hvem der har adgang til den indstilling du lige lavede (i dit tilfælde \'baren\').
Jeg håber det virker, men jeg er ikke sikker da jeg ikke kender meget til mySQL, men SQL\'en burde være det samme.
bortset fra det, så regner jeg med at du mener: herlevkollegiet.person.fornavn ...
ja, det kunne jo være at jeg skulle gøre det, men det er lidt besværligt når man i forvejen har en masse data liggende der, samt en masse script der tager kontakt til den database.... men det var nu ikke et dumt svar... hmmm
næææ jeg er ikke sikker på at database navnet skal stå først.
Hvis man ser på det link du pastede så står tabel-navn rent faktisk først..
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY \'password\'] [, user_name [IDENTIFIED BY \'password\'] ...] [WITH GRANT OPTION]
her er et par idéer, prøv at vende den
GRANT SELECT (fornavn), SELECT (efternavn) ON {person.herlevkollegiet} TO baren
GRANT SELECT (fornavn), SELECT (efternavn) ON person.herlevkollegiet TO baren
ang. om tbl_name står først: ja, det gør det, men det står som en faktor i et logisk udtryk... det vil sige at man enten(OR=|) kan skrive: tabelnavn(tbl_name) eller * (alle tabeller)eller *.* (alle tabeller i alle databaser) eller databasenavn.tabelnavn (db_name.*)
men det er ikke det der skal skille os ad. Jeg har selvfølgelig også prøvet på din måde, men der kommer en fejl om at der ikke eksisterer tabellen person.herlevkollegiet. Det gør der ikke i min. Men alligevel virker det ikke.
hmmm, det er noget mærkeligt noget...
by the way, kender du jon, thøger(anders) og det der slæng? Hvis du gør, så kan du sikkert huske mig, det er Lasse(jons ven)
men det er helt sikkert tættere på sandheden end de tidligere forslag... jeg tror at det muligvis er en fejl i Mysql. Det begrunder jeg med at den skriver i de rigtige tabeller. Jeg tror jeg opgraderer til en ny version også vender jeg tilbage....
ja, det må vi lige arrangere.... altså det med pils.
Det andet kan jeg ikke udtale mig om :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.