Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Überprüfen Sie Referenzen, wenn Sie Funktions-/Prozedursignaturen ändern

Sie können einer Systemtabelle keinen Trigger hinzufügen, aber Sie können einen DDL-Trigger erstellen, der bei der ALTER PROC-Anweisung ausgelöst wird – Beispiel:

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

Ich bin mir nicht sicher, wie ich an die vorherige Parameterliste komme oder ob es überhaupt möglich ist - weiß es jemand?

Ich würde dem Vorschlag von Charles zustimmen, neue Parameter nach Möglichkeit optional zu machen - bestehender Code wird nicht kaputt gehen und Sie müssen die Referenzen nur finden, wenn Sie müssen Parameter zum Aufruf hinzufügen.

Das Skripting der Datenbank scheint ein langer Weg zu sein. Eine einfache Abfrage wie die folgende sollte alle Verweise auf Ihre Prozedur (innerhalb Ihrer Datenbank) finden:

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

Dies ist dasselbe, funktioniert aber auch in früheren Versionen von SQL Server:

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

Hoffe, das hilft,

MDD