L’altro giorno stavo lavorando sul database della piattaforma che gestisco e avevo necessita’ di cambiare l’owner definito per tutte le tabelle e stored procedure del mio database sql Server 2000
Ovviamente il dubbio amletico era effettuare la sp_changeobjectowner punto per punto, elemento per elemento, allora mi sono detto:”ma non e’ possibile effettuare l’operazione massivamente?”
Aguzza l’ingegno e dopo il more la soluzione
La procedura e’ quella che vedete sotto:
DECLARE @tbl sysname
declare @elemento_da_modificare varchar(256)
declare @oldowner varchar(256)
declare @newowner varchar(256)select @oldowner = ‘vecchio_owner’
select @newowner = ‘nuovo_owner’DECLARE tblcur INSENSITIVE CURSOR FOR
SELECT name FROM sysobjects
WHERE xtype = ‘U’ AND uid = user_id(@oldowner)
OPEN tblcur
FETCH tblcur INTO @tbl
WHILE @@FETCH_STATUS = 0
BEGIN
select @elemento_da_modificare = @oldowner + ‘.’ + @tbl
EXEC sp_changeobjectowner @elemento_da_modificare , @newowner
FETCH tblcur INTO @tbl
END
DEALLOCATE tblcur
Update dopo i consigli di Lorenzo
Il tutto parte dal presupposto che sul database SQL esiste una tabella sysobjects in cui sono enunciati tutti gli elementi esistenti nel DB (tabelle e stored procedure) che sono associati alla id dell’owner che devi cambiare.
Cmq funziona provare per credere.
Carino, carino, pero’ io avrei usato la condizione nel WHILE, senza il BREAK ed avrei specificato che si tratta di SQLServer 2000 😉
Piccolo commento
WHERE xtype = ‘U’ tira fuori tutte le tabelle di cui e’ owner il vecchio owner
per modificare anche le SP
utilizzate:
WHERE xtype = ‘P’