[NHibernate] Oracle table owner in query, hoe?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hoi,

Ik ben wat aan het stoeien met Nhibernate. Wij gebruiken echter voor onze applicatie een Oracle DB.
Nu is deze database als volgt opgebouwd.

iedere klant heeft een user, bijv. user_klantx
onder deze user hangen een aantal tabellen.

daarboven is een algemene user gedefinieerd, die noem ik nu even user_default.

onder deze user default hangen alle tabellen van alle user_klantx -en.
Nu heb ik in Nhibernate een session opgevraagd met als user de user_default.

Hoe kan ik nu een query maken, of mijn objecten laten querien op de tabellen van bijv. user_klant1?
Is dit eigenlijk wel mogelijk met Nhibernate?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 10-05 20:21

leuk_he

1. Controleer de kabel!

voor table naam USER.TABLE opgeven?

http://www.hibernate.org/...mapping-declaration-class

dus in de mapping
<class name="Cat" table="USER.Cat">


Of zeg ik nu iets doms?

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
je zegt niets doms alleen word de user @ runtime bepaald, dus kan ik hem niet in de mapping opnemen. (iedere user heeft dus ook dezelfde tabellen)

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 10-05 20:21

leuk_he

1. Controleer de kabel!

Kun je in een perssistent class niet de table property veranderen?

of (zoek woorden googel = dynamic table nhibernate )

of
http://slagd.com/?p=62


(sorry, gebruike het echt te weinig, ben er vrij zeker van dat het mogelijk is)

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
4of9 schreef op donderdag 12 maart 2009 @ 13:29:
Hoi,

Ik ben wat aan het stoeien met Nhibernate. Wij gebruiken echter voor onze applicatie een Oracle DB.
Nu is deze database als volgt opgebouwd.

iedere klant heeft een user, bijv. user_klantx
onder deze user hangen een aantal tabellen.

daarboven is een algemene user gedefinieerd, die noem ik nu even user_default.

onder deze user default hangen alle tabellen van alle user_klantx -en.
Nu heb ik in Nhibernate een session opgevraagd met als user de user_default.

Hoe kan ik nu een query maken, of mijn objecten laten querien op de tabellen van bijv. user_klant1?
Is dit eigenlijk wel mogelijk met Nhibernate?
In oracle is iedere user een schema. Per schema heb je dus een nieuwe set tables. Dit is jouw situatie? Want ik begrijp niet echt wat je dan bedoelt met user_default, want dat zou dan inhouden dat je 1 schema hebt met alle tables en in ieder user schema een set synonyms

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Als ik het goed lees heeft de peristent class de mogelijkheid een ander schema aan te roepen en daar de tabellen te gebruiken.

Maar geen idee verder wat die class doet :X

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
EfBe schreef op donderdag 12 maart 2009 @ 15:38:
[...]

In oracle is iedere user een schema. Per schema heb je dus een nieuwe set tables. Dit is jouw situatie? Want ik begrijp niet echt wat je dan bedoelt met user_default, want dat zou dan inhouden dat je 1 schema hebt met alle tables en in ieder user schema een set synonyms
de user_default (heet in het echt anders) heeft rechten op alle user_klantxxx schema's.

Ik connect dus met nhibernate via user_default. Ik wil echter een query uitvoeren op een user_klantxxx table (als in select * from user_klantxxx.table1) en die user_klantxxx wordt @ runtime bepaald.

Ik heb het nu al geprobeerd via de CreateSQLQuery, dat werkt ook wel, ik vroeg me alleen af of het niet beter kan?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 13:30

momania

iPhone 30! Bam!

Volgens mij kan je het net zoals in Hibernate wel met een Interceptor doen. Voor nHibernate kun je van de EmptyInterceptor de onPrepareStatement method implementeren en daar de default schema vervangen met de user schema.

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

  • Gabberhead
  • Registratie: Mei 2002
  • Laatst online: 07-12-2020

Gabberhead

Pluizig en blauw

*ril*
Dit klinkt eng. Je gaat security op de database oplossen in een Hibernate laag?
Bovendien maak je voor elke klant een nieuwe database-user aan, met z'n eigen objecten. Je kopieert dus alle database objecten naar een nieuw schema als zich een andere klant aanmeldt?

Is het niet veel verstandiger om gebruik te gaan maken van Oracle VPD (Virtual Private Database). op die manier kun je volstaan met 1 database schema, waar je vervolgens policies op los laat. Die policies kun je op row-level leggen, zodat iedere klant alleen z'n eigen data kan zien. En vervolgens hoef je alleen maar een policy aan te maken voor je user_default, zodat deze alle data in kan zien.

Wat je nu waarschijnlijk moet gaan doen is een view maken met een UNION daarin over alle klant_user tabellen (of hun synonyms).
code:
1
2
3
4
5
6
select *
from klant1.table
UNION ALL
select * 
from klant2.table
enz..

Integratie ontwikkelaars hier melden! http://www.whitehorses.nl

"If everything seems under control, you're just not going fast enough."


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Gabberhead schreef op vrijdag 13 maart 2009 @ 09:10:
*ril*
Dit klinkt eng. Je gaat security op de database oplossen in een Hibernate laag?
Bovendien maak je voor elke klant een nieuwe database-user aan, met z'n eigen objecten. Je kopieert dus alle database objecten naar een nieuw schema als zich een andere klant aanmeldt?

Is het niet veel verstandiger om gebruik te gaan maken van Oracle VPD (Virtual Private Database). op die manier kun je volstaan met 1 database schema, waar je vervolgens policies op los laat. Die policies kun je op row-level leggen, zodat iedere klant alleen z'n eigen data kan zien. En vervolgens hoef je alleen maar een policy aan te maken voor je user_default, zodat deze alle data in kan zien.

Wat je nu waarschijnlijk moet gaan doen is een view maken met een UNION daarin over alle klant_user tabellen (of hun synonyms).
code:
1
2
3
4
5
6
select *
from klant1.table
UNION ALL
select * 
from klant2.table
enz..
in een ideale wereld is er ook geen oorlog. ;) Ik ben echter gebonden aan de bestaande applicatie die zo door anderen is opgezet.

Die union wil ik juist niet, want ik wil juist data uit de klantspecifieke tabel.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • Gabberhead
  • Registratie: Mei 2002
  • Laatst online: 07-12-2020

Gabberhead

Pluizig en blauw

Kan op zich ook wel. Dan vul je de query in de view aan met nog 1 extra kolom; klant.
Krijg je zoiets:
code:
1
2
3
4
5
6
7
8
select 'klant1' klant
     , t.*
  from klant1.table t
union all
select 'klant2' klant
     , t.*
  from klant2.table t
enz...


En vervolgens selecteer je uit de view met een extra where clause
code:
1
2
3
select *
  from klantview
 where klant = 'klant1';


Dan krijg je alleen het probleem dat je de view moet gaan uitbreiden telkens als je een nieuwe klant krijgt.
Maarja, aangezien je dan toch al bezig bent om een compleet schema in te richten, lijkt me dat in verhouding een klein extra klusje.

Integratie ontwikkelaars hier melden! http://www.whitehorses.nl

"If everything seems under control, you're just not going fast enough."


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Ik waardeer je reactie hoor, maar als je goed leest zoek ik een oplossing op met NHibernate uit een schema specifieke tabel te selecteren. Ik heb namelijk gewoon niet de mogelijkheden om views, sp's andere schema's of users te creeeren/wijzigen etc.

De situatie is als beschreven, en niet anders.

Ik had overigens al iets over de IInterceptor gelezen, misschien moet ik het op die manier doen.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
even een subtiel bumpje.

Ik heb nog steeds niet de echte oplossing, en sta op het punt om het via de CreateSqlQuery te doen, waarbij ik gewoon "dynamische sql" ga maken. Dit voelt niet goed maar ik kom er anders even niet uit.

De term die ik op internet tegenkom is "Horizontal partitioning" icm (N)Hibernate Shards. Misschien zet deze termoloie mensen op een beter spoor voor mijn probleem?

De Interceptor leek me ok wel iets, alleen kan ik niet vinden hoe ik een string kan inserten die ik in de interceptor kan replacen.

Ik hoop dat iemand mij nog verder kan helpen!

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
sharding is een overbodig ingewikkelde techniek om data die eigenlijk in 1 tabel hoort over meerdere tables in meerdere instances te verdelen, dus bv customers met 1-10000 staan in tab1 op instance 1 en customers 10001-20000 staan in tab1 op instance2. Ik noem het overbodig ingewikkeld omdat het aan de ene kant wel performance kan verhogen maar aan de andere kant het totaal niet transparant is en de developer dus opzadelt met code die erg specifiek is voor de gekozen shard strategie en als deze wijzigt de code ook moet wijzigen.

Anyway, niet van toepassing op jou, 4of9, jij hebt gewoon je applicatie totaal gepartitioneerd, dus wat je zoekt is schema name overwriting in de query. Ik kon 1 2 3 niet iets vinden mbt nhibernate hoe je dat moet oplossen. Een IInterceptor lijkt me niet want die laat je geen query specifieke zaken wijzigen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
kan LLBLGen dat wel?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Tuurlijk

Je kunt per call catalog en/of schema names overwriten, zowel op config file niveau als in code. je maakt dus 1 keer een applicatie met een bepaald schema en per klant overwrite je die name dmv of door code de overwrite op te geven of dmv een config file setting als dat mogelijk is/nodig is.

[ Voor 32% gewijzigd door EfBe op 16-03-2009 16:28 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1