sql >> Database >  >> RDS >> Sqlserver

SQL Server:Controleer referenties bij het wijzigen van functie-/procedurehandtekeningen

U kunt geen trigger toevoegen aan een systeemtabel, maar u kunt wel een DDL-trigger maken die wordt geactiveerd op de ALTER PROC-instructie - voorbeeld:

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

Ik weet niet zeker hoe ik de vorige parameterlijst kan krijgen of dat het zelfs mogelijk is - weet iemand dat?

Ik ben het eens met de suggestie van Charles om nieuwe parameters indien mogelijk optioneel te maken - bestaande code zal niet breken en je hoeft de referenties alleen te vinden als je moet voeg de parameter toe aan de oproep.

Het uitschrijven van de database lijkt de lange weg. Een eenvoudige zoekopdracht zoals de volgende zou alle verwijzingen naar uw proc (in uw database) moeten vinden:

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

Dit is hetzelfde, maar werkt ook in eerdere versies van SQL server:

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

Ik hoop dat dit helpt,

MDD



  1. JSON_STORAGE_SIZE() - Vind de opslaggrootte van een JSON-document in MySQL

  2. Linker join met dynamische tabelnaam afgeleid van kolom

  3. Kan ik MySQL-functies gebruiken in de LIMIT-offset?

  4. SqlDeveloper:lijst met netwerkaliassen wissen