Look for the signal in your life, not the noise.
Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Maak je heel toevallig gebruik van application roles en een partially contained database ??
Daarmee gaat het sowieso namelijk niet werken.
Volgens mij is het probleem dat je de dynamische SQL waarschijnlijk draait onder de credentials van de gebruiker (die dus geen rechten op de tabel heeft in db2), deze kan geen objecten aanroepen waar hij geen rechten op heeft.
Waarschijnlijk gaat het d.m.v. 'execute as' wel goed.
Groeten,
Kalin
Daarmee gaat het sowieso namelijk niet werken.
Volgens mij is het probleem dat je de dynamische SQL waarschijnlijk draait onder de credentials van de gebruiker (die dus geen rechten op de tabel heeft in db2), deze kan geen objecten aanroepen waar hij geen rechten op heeft.
Waarschijnlijk gaat het d.m.v. 'execute as' wel goed.
Groeten,
Kalin
Nee helaas. Daar maak ik geen gebruik van.
DB1 en DB2 hebben dezelfde 'owner', deze is gekoppeld aan schema dbo en role db_owner, alles wat een standaard database owner heeft. Qua rechten moet de gebruiker dus overal bij kunnen.
De stored procedure is ook geautoriseerd om uit te voeren onder die eigenaar (WITH EXECUTE AS OWNER), printen van systemuser geeft dan ook aan dat de stored procedure uitgevoerd wordt onder de 'owner' van de database. De dynamische SQL wordt dan dus ook uitgevoerd onder die 'owner'.
Wat mij onderhand is opgevallen is dat het al eerder mis gaat en dus niet aan de dynamische SQL lijkt te liggen. De 'owner' mag bij een eerdere query naar DB2 al niet bij de database terwijl hij daar owner van is, vreemd. Net alsof de owner van een database niet automatisch bij alle inhoud mag.
DB1 en DB2 hebben dezelfde 'owner', deze is gekoppeld aan schema dbo en role db_owner, alles wat een standaard database owner heeft. Qua rechten moet de gebruiker dus overal bij kunnen.
De stored procedure is ook geautoriseerd om uit te voeren onder die eigenaar (WITH EXECUTE AS OWNER), printen van systemuser geeft dan ook aan dat de stored procedure uitgevoerd wordt onder de 'owner' van de database. De dynamische SQL wordt dan dus ook uitgevoerd onder die 'owner'.
Wat mij onderhand is opgevallen is dat het al eerder mis gaat en dus niet aan de dynamische SQL lijkt te liggen. De 'owner' mag bij een eerdere query naar DB2 al niet bij de database terwijl hij daar owner van is, vreemd. Net alsof de owner van een database niet automatisch bij alle inhoud mag.
Look for the signal in your life, not the noise.
Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Het zijn van owner van de db hoeft niet te betekenen dat je bij alle objecten kunt.
Het is zelfs te realiseren dat een SysAdmin alles kan behalve de data inzien.
Heb je al geprobeerd of de owner inderdaad vanuit DB1 bij de data in DB2 kan komen ??
Het is zelfs te realiseren dat een SysAdmin alles kan behalve de data inzien.
Heb je al geprobeerd of de owner inderdaad vanuit DB1 bij de data in DB2 kan komen ??
Natuurlijk, maar als de 'owneruser' aan de database gemapped is als 'dbo', schema 'dbo' heeft en rol 'db_owner' dan ga ik daar wel een beetje van uit. 
Als ik inlog als die user kan ik dan ook gewoon bij de database, opvallend is wel dat hij opnieuw het verbindingsdialoog geeft bij het doen van een query. Alsof er een tweede stap moet plaatsvinden ofzo.
Als ik inlog als die user kan ik dan ook gewoon bij de database, opvallend is wel dat hij opnieuw het verbindingsdialoog geeft bij het doen van een query. Alsof er een tweede stap moet plaatsvinden ofzo.
Look for the signal in your life, not the noise.
Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Werk je toevallig met contained databases, dat zou wel dit gedrag kunnen verklaren (logins zijn niet aan elkaar gerelateerd, authenticatie vindt plaats op db niveau, niet op server)....
Niet specifiek, mijn analyse:
• stored procedure draait als OWNER, maar gebruikt de USER en niet de LOGIN
• een USER heeft geen rechten op IMPERSONATE op een LOGIN
• faalt dus.
Uiteindelijk heb ik het werkend gekregen op de volgende manier:
• aanroepende user (CALLER) IMPERSONATE gegeven op de LOGIN proxyuser
• de stored procedure doet intern een EXECUTE AS LOGIN proxyuser
• proxyuser heeft de benodigde rechten.
Maar omdat dit voelt als 'security by obscurity' heb ik de oplossing afgewezen. Als iemand immers doorkrijgt dat de proxyuser bestaat kunnen ze ook direct EXECUTE AS doen en mijn logicalaag omzeilen.
Nieuwe oplossing gevonden en geïmplementeerd, het werkt.
• Certificate gemaakt, en daaruit een user in DB2.
• USER in DB2 juiste rechten gegeven.
• Certificate gekopieerd naar DB1
• Stored procedure in DB1 gesigned.
Nu werkt het zonder rare impersonate constructies, als je execute op de stored procedure hebt zorgt het certificaat voor de overige rechten om data op te halen.
Voor views werkt het sowieso al vanwege de ownership chain die bestaat tussen de beide databases.
• stored procedure draait als OWNER, maar gebruikt de USER en niet de LOGIN
• een USER heeft geen rechten op IMPERSONATE op een LOGIN
• faalt dus.
Uiteindelijk heb ik het werkend gekregen op de volgende manier:
• aanroepende user (CALLER) IMPERSONATE gegeven op de LOGIN proxyuser
• de stored procedure doet intern een EXECUTE AS LOGIN proxyuser
• proxyuser heeft de benodigde rechten.
Maar omdat dit voelt als 'security by obscurity' heb ik de oplossing afgewezen. Als iemand immers doorkrijgt dat de proxyuser bestaat kunnen ze ook direct EXECUTE AS doen en mijn logicalaag omzeilen.
Nieuwe oplossing gevonden en geïmplementeerd, het werkt.
• Certificate gemaakt, en daaruit een user in DB2.
• USER in DB2 juiste rechten gegeven.
• Certificate gekopieerd naar DB1
• Stored procedure in DB1 gesigned.
Nu werkt het zonder rare impersonate constructies, als je execute op de stored procedure hebt zorgt het certificaat voor de overige rechten om data op te halen.
Voor views werkt het sowieso al vanwege de ownership chain die bestaat tussen de beide databases.
Look for the signal in your life, not the noise.
Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Pagina: 1