Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :vérifier les références lors de la modification des signatures de fonction/procédure

Vous ne pouvez pas ajouter de déclencheur à une table système, mais vous pouvez créer un déclencheur DDL qui se déclenchera sur l'instruction ALTER PROC - exemple :

ALTER TRIGGER DDL_PROC
ON DATABASE
FOR ALTER_PROCEDURE
AS
DECLARE @data XML, @ObjectName sysname, @ParamCount int
SET @data = EVENTDATA()
SET @ObjectName = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')

PRINT 'You have changed procedure: ' + @ObjectName
SELECT @ParamCount = COUNT(*) FROM sys.parameters
WHERE object_id = OBJECT_ID(@ObjectName)
RAISERROR('This procedure now has %i parameter(s)',0,0,@ParamCount)
GO

Je ne sais pas comment obtenir la liste des paramètres précédents ou si c'est même possible - quelqu'un sait-il ?

Je serais d'accord avec la suggestion de Charles de rendre les nouveaux paramètres facultatifs si possible - le code existant ne se cassera pas et vous n'aurez qu'à trouver les références si vous devez ajouter le paramètre à l'appel.

Scripter la base de données semble être un long chemin à parcourir. Une simple requête telle que la suivante devrait trouver toutes les références à votre proc (dans votre base de données) :

SELECT so.name, so.type_desc
FROM sys.all_objects so
    JOIN sys.all_sql_modules sm ON so.[object_id] = sm.[object_id]
WHERE sm.[definition] LIKE '%<proc name>%'

C'est la même chose, mais cela fonctionnera également dans les versions précédentes de SQL Server :

SELECT so.name, so.type
FROM syscomments sc
    JOIN sysobjects so ON sc.id = so.id
where text like '%<proc name>%'

J'espère que cela vous aidera,

MD