Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server:controlla i riferimenti quando si alterano le firme di funzione/procedura

Non puoi aggiungere un trigger a una tabella di sistema, ma puoi creare un trigger DDL che si attiverà sull'istruzione ALTER PROC - esempio:

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

Non sono sicuro di come ottenere l'elenco dei parametri precedente o se è anche possibile - qualcuno lo sa?

Sono d'accordo con il suggerimento di Charles di rendere facoltativi i nuovi parametri, se possibile:il codice esistente non si romperà e dovrai solo trovare i riferimenti se devi aggiungi il parametro alla chiamata.

Lo scripting del database sembra la strada più lunga. Una semplice query come la seguente dovrebbe trovare tutti i riferimenti al tuo proc (all'interno del tuo database):

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>%'

Questa è la stessa cosa, ma funzionerà anche nelle versioni precedenti di SQL Server:

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

Spero che questo aiuti,

MDD