Sql server 2005 - changer le schema des objets dans les objets appelant

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 476 fois - Téléchargée 27 fois

Contenu du snippet

Après avoir changé le schéma pour les objets (c'est-à-dire passer de MonAncienSchema.MaTable a MonNouveauSchema.MaTable), il faut appliquer ces changement dans les objets appelant (Procédures, Vues ou fonctions).

Voila donc un script qui effectue ce travail.

----------------------------------------------------------------------------------------------------------------
ATTENTION : FAITES UN BACKUP DE VOS BASE OU UN EXPORT EN SCRIPT DE TOUS LES OBJETS QUI SERONT MODIFIES
----------------------------------------------------------------------------------------------------------------

Source / Exemple :


USE [sccEnc]
GO

DECLARE @SQLCMD		AS NVARCHAR(4000)
DECLARE @SQL				AS NVARCHAR(max)
DECLARE @OldSchema		AS VARCHAR(200)
DECLARE @NewSchema		AS VARCHAR(200)
DECLARE @IDOBJECT AS INT
DECLARE @NUMBERLINE AS INT

SET @OldSchema = 'serveur'
SET @NewSchema = 'dbo'

DECLARE CURSORCHANGESCHEMA CURSOR FOR SELECT DISTINCT CMT.id FROM sys.syscomments CMT INNER JOIN sys.sysobjects OBJ ON CMT.id = OBJ.id
				WHERE (OBJ.type = 'V' OR OBJ.type = 'P' OR OBJ.type='FN') AND NOT(OBJ.name LIKE 'dt_%') AND NOT(OBJ.name LIKE 'sp_%')
OPEN CURSORCHANGESCHEMA
FETCH NEXT FROM CURSORCHANGESCHEMA INTO @IDOBJECT
WHILE (@@fetch_status >= 0) 
	BEGIN 

		SET @SQL = ''
		SELECT @NUMBERLINE = COUNT(CMT.id) FROM  sys.syscomments CMT WHERE CMT.id = @IDOBJECT
		PRINT CAST(@NUMBERLINE AS VARCHAR(5)) +' - '+ CAST(@IDOBJECT AS VARCHAR(10))

		IF (@NUMBERLINE > 1)
			BEGIN 
				DECLARE CURSORSP CURSOR FOR SELECT CMT.text FROM sys.syscomments CMT WHERE CMT.id = @IDOBJECT ORDER BY colid ASC
				OPEN CURSORSP
				FETCH NEXT FROM CURSORSP INTO @SQLCMD
				WHILE (@@fetch_status >= 0) 
					BEGIN 
						SET @SQL =  @SQL + CAST(@SQLCMD AS NVARCHAR(4000))
						FETCH NEXT FROM CURSORSP INTO @SQLCMD
					END
				CLOSE CURSORSP
				DEALLOCATE CURSORSP
			END
		ELSE
			BEGIN
				SELECT @SQL = CMT.text FROM sys.syscomments CMT WHERE CMT.id = @IDOBJECT
			END

		SET @SQL = RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(@SQL, 'CREATE', 'ALTER'), @OldSchema +'.', @NewSchema +'.'), '['+ @OldSchema +'].', '['+ @NewSchema +'].')))

		SET @SQL = '----------------------------------------------------------------'+ char(13) + '-- Modification effectuée le : '+ CONVERT(VARCHAR(100), getdate()) + char(13) + '----------------------------------------------------------------'+ char(10) + char(13) + @SQL
		SET @SQL = @SQL + char(10) + char(13) +'----------------------------------------------------------------'
		BEGIN TRY
			EXECUTE(@SQL)
			PRINT 'REQUETE REUSSIE : '+ char(13) + @SQL
		END TRY
		BEGIN CATCH
			PRINT 'ERREUR ('+ ERROR_MESSAGE() +') DANS LA REQUETE : '+ char(13) + @SQL
		END CATCH

		FETCH NEXT FROM CURSORCHANGESCHEMA INTO @IDOBJECT
	END
CLOSE CURSORCHANGESCHEMA
DEALLOCATE CURSORCHANGESCHEMA

Conclusion :


Bon coding

Romelard Fabrice [MVP]

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.