[ Milos D @ 13.12.2004. 10:43 ] @
Pretpostavljam da ovo ne moze da se izvede, ali ko pita ne skita. Da li postoji nacin da se baza definise tako da se jedna tabela "deli" medju korisnicima: svi mogu da je vide i da upisu nove podatke, ali brisanje reda je dozvoljeno samo onima koji su taj red upisali? Znaci, svako moze da uradi INSERT, ali UPDATE/DELETE reda moze samo onaj ko je uradio INSERT tog reda?

Naravno, to moze da se resi na nivou softvera koji pristupa bazi, automatski se upise ID_KORISNIKA u svaki red koji je napravio, ali ko zna SQL moze da "zaobidje" softver i da radi sta god hoce sa tom tabelom. Da li moze tako nesto da se definise na nivou baze? Da li postoji neki drugi nacin da se odradi to sto sam zamislio?
[ dogriz @ 13.12.2004. 12:04 ] @
Može da se izvede.
Definiši "usere, kreiraj "role" nad bazom i podesi grant options.

NPR:
Code:
CREATE ROLE administrator;
GRANT UPDATE ON table1 TO administrator;
GRANT administrator TO user1, user2, user3;



Detaljno uputstvo imaš na www.ibphoenix.com (u nekom od pdf-ova).
[ Milos D @ 13.12.2004. 12:13 ] @
Mislim da se nismo razumeli, tvoj primer radi samo na nivou cele tabele, meni treba "suptilnije" ogranicenje od toga.

npr.

GRANT UPDATE ON table1 TO pera where table1.user_id=55;
GRANT UPDATE ON table1 TO mika where table1.user_id=56;
GRANT UPDATE ON table1 TO laza where table1.user_id=57;
[ protech_v2 @ 13.12.2004. 14:13 ] @
Meni se cini da je tvoj problem prvenstveno u tome sto treba da znas ko je owner nekog recorda tj, onaj ko ga je napravio. Ne znam da ti kazem kako da to nadjes i da li firebird uopste cuva tu informaciju, ali probaj da trazis po google-u nesto na tu varijantu, a posle je lako napraviti nesto sa time (pada mi na pamet koriscenje triggera na BEFORE DELETE)

na [url]www.ibphoenix.com/main.nfs?a=ibphoenix& s=1101948673:391781&page=ibp_locking[/url] ima nesto o locking mehanizmima u firebirdu - mozda to na neki nacin moze da se iskoristi?
[ Riste Pejov @ 13.12.2004. 15:04 ] @
Pretpostavka ti nije tacna :)

Ovaj problem za da ogranicis korisnike po zapisu se resava ovako:

Code:

// Kreiras baznu tabelu:
CREATE TABLE primer( 
       data VARCHAR(10),
       user_name CHAR(31)
)

CREATE TRIGGER "user_ins" FOR primer ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
    new.user_name = CURRENT_USER;
END; 

CREATE VIEW vprimer AS SELECT data FROM primer WHERE CURRENT_USER = user_name;


i sada posto imamo tabelu koja ima sve recorde, i imamo view koji ogranicava korisnike da update/delete/select recorde drugih korisnika, samo treba da dodelime privilegije usera da select/insert/update view.

znaci sada ti treba

GRANT ALL ON primer TO vprimer;
GRANT ALL ON vprimer TO public;

u ovom slucaju svako moze dirati samo svoje recorde. ako zelis da useri vide zapise drugih usera onda samo dodas:

GRANT SELECT ON primer TO public;

Ako eventualno ne zelis da useri znaji ko poseduje zapis onda uradis nov view bez kolone user_name ... i tako dalje :)
[ Milos D @ 13.12.2004. 16:55 ] @
Ah, CURRENT_USER - kljucni detalj, za to nisam znao! Zvuci savrseno. Hvala!