sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:Kontrollera referenser när du ändrar funktions-/procedursignaturer

Du kan inte lägga till en utlösare till en systemtabell, men du kan skapa en DDL-utlösare som aktiveras på ALTER PROC-satsen - exempel:

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

Jag är inte säker på hur man får den föregående parameterlistan eller om det ens är möjligt - vet någon?

Jag håller med Charles förslag att göra nya parametrar valfria om möjligt - befintlig kod kommer inte att gå sönder och du behöver bara hitta referenserna om du måste lägg till parametern i anropet.

Att skriva ut databasen verkar vara den långa vägen runt. En enkel fråga som följande bör hitta alla referenser till din proc (inom din databas):

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

Detta är samma sak, men kommer också att fungera i tidigare versioner av SQL-server:

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

Hoppas detta hjälper,

MDD



  1. php mysql lagrar radbrytningar i textområdet i databasen

  2. Hur använder man regexp på resultaten av en underfråga?

  3. Använder Oracle kortslutningsutvärdering?

  4. Ange uttryckligen en cells datatyp som text för talvärden