Subject: Utenti trigger
From: Stefano
Date: 5/14/2007 8:17:28 AM
Ciao,
ho un trigger che preleva i dati da una tabella nel database A (al quale
appartengono diversi utenti) e li scrive in altra tabella nel database B
(monoutente)
Se l'utente che legge dal database A non è presente in B il trigger
restituisce un errore.
E' possibile ovviare in qualche modo oppure debbo necessariamente avere gli
stessi utenti nei due db?
Grazie. Ciao. Stefano.
Subject: Utenti trigger
From: Andrea Benedetti
Date: 5/14/2007 10:01:30 AM
Salve Stefano,
"Stefano" <ormaiocc@tin.it> ha scritto nel messaggio
news:U9T1i.45958$281.31510@tornado.fastwebnet.it...
> Ciao,
> ho un trigger che preleva i dati da una tabella nel database A (al quale
> appartengono diversi utenti) e li scrive in altra tabella nel database B
> (monoutente)
> Se l'utente che legge dal database A non è presente in B il trigger
> restituisce un errore.
> E' possibile ovviare in qualche modo oppure debbo necessariamente avere
> gli stessi utenti nei due db?
Se utilizzi SQL Server 2005 puoi ricorrere alla clausola "EXECUTE AS" che ti
permette di far eseguire il tuo codice all'interno di un differente
contesto.
Nel tuo caso hai anche bisogno di utilizzare, sul tuo database di partenza,
l'impostazione SET TRUSTWORTHY ON perchè devi uscire dal contesto del tuo
db.
Attenzione che, per poter impostare questa proprietà sul database, devi
avere diritti di tipo sysadmin.
Prova a vedere questo (stupido) esempio:
/* costruisco due db: A e B */
use master
go
create database A
go
create database B
go
/* creo un login, quindi un utente su A */
CREATE LOGIN [utenteA] WITH PASSWORD=N'utenteA', DEFAULT_DATABASE=[A],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [A]
GO
CREATE USER [utenteA] FOR LOGIN [utenteA]
EXEC sp_addrolemember N'db_owner', N'utenteA'
GO
/* costruisco, sia su A che su B una tabella di esempio */
use A
go
create table prova (colonna int)
go
use B
go
create table prova (colonna int)
go
/* creo su A un trigger di insert che vada a scrivere in B */
use A
go
create trigger tr_insert on prova
for insert
as
begin
insert B..prova
select * from prova
end
go
/* !!! mi collego come "utenteA" !!! */
insert prova values (1)
/*
Errore:
The server principal "utenteA" is not able to access the database "B" under
the current security context.
*/
/* !!! mi riconnetto come admin !!! */
USE master
go
ALTER DATABASE A SET TRUSTWORTHY ON
go
use a
go
drop trigger tr_insert
go
/* ricreo il trigger con la clausola "execute as" */
create trigger tr_insert on prova
with execute as owner
for insert
as
begin
insert B..prova
select * from prova
end
go
/* mi collego come "utenteA"*/
insert prova values (2)
/* faccio pulizia */
use master
drop database A
drop database B
drop login utenteA
go
> Grazie. Ciao. Stefano.
Ciao!
--
Andrea Benedetti
Microsoft MVP - SQL Server
www.absistemi.it - www.ugiss.org
http://blogs.ugidotnet.org/ab
http://mvp.support.microsoft.com
http://italy.mvps.org
Subject: Utenti trigger
From: Stefano
Date: 5/14/2007 10:17:36 AM
"Andrea Benedetti" <abenedetti@absistemi.it> ha scritto nel messaggio
news:ujdeV4flHHA.1776@TK2MSFTNGP05.phx.gbl...
> Salve Stefano,
> Se utilizzi SQL Server 2005 puoi ricorrere alla clausola "EXECUTE AS" che
> ti permette di far eseguire il tuo codice all'interno di un differente
> contesto.
Grazie per la risposta.
Purtroppo utilizzo SqlServer 2k, è possibile anche con questa versione?
Grazie. Ciao. Stefano.
Subject: Utenti trigger
From: Andrea Benedetti
Date: 5/14/2007 10:41:09 AM
Ciao Stefano,
"Stefano" <ormaiocc@tin.it> ha scritto nel messaggio
news:zWU1i.46080$281.22151@tornado.fastwebnet.it...
> Grazie per la risposta.
;-)
> Purtroppo utilizzo SqlServer 2k, è possibile anche con questa versione?
SQL Server 2000 non ha la possibilità di modificare il contesto di
esecuzione del codice.
Potresti (non l'ho mai fatto, ma a naso direi che il giro potrebbe tornare)
utilizzare un linked server.
E quindi utilizzare questo all'interno del trigger.
Per costruire un linked server puoi partire da qui:
"Utilizzare Linked Server verso SQL Server"
http://www.absistemi.it/tipsql.aspx?id=210
> Grazie. Ciao. Stefano.
Ciao!
--
Andrea Benedetti
Microsoft MVP - SQL Server
www.absistemi.it - www.ugiss.org
http://blogs.ugidotnet.org/ab
http://mvp.support.microsoft.com
http://italy.mvps.org
|