[ plotter @ 07.05.2009. 00:22 ] @
Vec sam uradio sledece:

Code:

CREATE LOGIN [login] WITH PASSWORD='password';
CREATE USER [user] FOR LOGIN [login] WITH DEFAULT_SCHEMA=[A]


Na serveru imam nekoliko baza i svaka ima preko 100 tabela, cilj je da [user] ima SELECT,UPDATE,INSERT, DELETE privilegije samo na jednoj tabeli iz baze [A].
Ostalim tabelama baze [A]...[n] ne bi smeo da ima pristup.

Pokusao sam da GRANT-ujem gore navedene privilegije za nalog [user], ali nalog implicitno dobija sve privilegije na bazi [A].
Jedino da kucam DENY za 99 tabela i na kraju GRANT za ovu jednu.
Da postoji neko bolje resenje?


[ mmix @ 07.05.2009. 10:18 ] @
Kreiraj novu rolu (ona je prazna po defaultu), dodaj permsiions za tabelu koju hoces i ubaci korisnika da bude samo u toj roli (izbaci iz postojecih)

Code:
CREATE ROLE [restricted] AUTHORIZATION [dbo]
go
GRANT DELETE, INSERT, SELECT, UPDATE ON [dbo].[Tabela] TO [restricted]
go

EXEC sp_droprolemember 'public', '[user]'
go
EXEC sp_addrolemember 'restricted', '[user]'
go
[ plotter @ 07.05.2009. 12:45 ] @
Pokusao sam na taj nacin ali i dalje imam dva problema:
1. Nije moguce uraditi sp_droprolemember za public rolu (SQL Server 2005)
2. Ograniceni user moze da radi cak i insert na svim tablama u bazi [A]

Ni u public roli ni u [restricted] roli ne postoji ni jedan GRANT na bazu [A] osim GRANT DELETE, INSERT, SELECT, UPDATE ON [dbo].[Tabela] TO [restricted].

btw. Da li treba da kazem USE [A] kada kreiram user-a i rolu, ili ovo treba vezati za neki drugi objekat?
[ mmix @ 07.05.2009. 14:44 ] @
Citat:
plotter: 1. Nije moguce uraditi sp_droprolemember za public rolu (SQL Server 2005)


Da, izvini. User je uvek po defaultu u public roli, a public bi trebalo da je prazan.
U svakom slucaju da bi bio siguran izvrsi sp_helpuser i vidi u kojim rolama se nalazi [user] i uradi sp_droprolemember za svaku od njih (sem restricted), ako imas neka prava sa userom onda to dolazi ili od direktnih dozvola ili od clanstva u nekoj roli. (Da vidis direktne GRANT-ove za usera koristi exec sp_helprotect @username='[user]')

Citat:
plotter:2. Ograniceni user moze da radi cak i insert na svim tablama u bazi [A]

Nisam siguran da si obavio sve kako treba. Ako restricted rola ima samo prava na jednoj tabeli i ako je user samo u toj roli onda nema druga prava sem tih. Ako postoje prava a public rola nema grantove onda ta prava dolaze od neke druge role u koju je uclanjen user, proveri sa sp_helpuser

Citat:
plotter:Ni u public roli ni u [restricted] roli ne postoji ni jedan GRANT na bazu [A]

Public je implicitna rola (npr kao Everyone u windowsu) i ne bi trebalo da ima uticaja na tvoj problem i ona treba da bude prazna. restricted rola sa druge strane mora da ima GRANT koji si malopre izvrsio. Verovatno je problem u sledecem:

Citat:
plotter: btw. Da li treba da kazem USE [A] kada kreiram user-a i rolu, ili ovo treba vezati za neki drugi objekat?

login je na nivou servera, ali su useri, role i dozvole na nivou baze, tako da je odgovor DA, treba ti USE [A] pre bilo kakvih izmena
[ plotter @ 07.05.2009. 14:54 ] @
Hvala na pomoci, neko je na SQL Serveru dao GRANT za sve privilegije na dbo.* public roli:
Code:

-- Imao sam sta da vidim kada sam izvrsio ovo....
select state_desc, permission_name, object_name(major_id) from sys.database_permissions where grantee_principal_id = user_id('public')


Dakle problem resen.
[ mmix @ 07.05.2009. 15:09 ] @
sp_helprotect @username='public' bi ti dao detaljniji rezultat od ove skripte. Samo mala napomena, na 2005 i 2008 public rola ima fabricki GRANT SELECT na sys.* tabele u bazi. Nisam siguran zasto, ali ima, i ako si dobio samo te objekte u listi onda to nije problem.