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

SQL Server:Tjek referencer ved ændring af funktions-/proceduresignaturer

Du kan ikke tilføje en trigger til en systemtabel, men du kan oprette en DDL-trigger, der udløses på ALTER PROC-sætningen - eksempel:

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

Jeg er ikke sikker på, hvordan jeg får den forrige parameterliste, eller om det overhovedet er muligt - ved nogen det?

Jeg er enig i Charles' forslag om at gøre nye parametre valgfrie, hvis det er muligt - eksisterende kode vil ikke gå i stykker, og du skal kun finde referencerne, hvis du skal tilføje parameteren til opkaldet.

Udskrivning af databasen virker som den lange vej rundt. En simpel forespørgsel som den følgende skulle finde alle referencer til din proc (i din 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>%'

Dette er det samme, men vil også fungere i tidligere versioner af SQL server:

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

Håber dette hjælper,

MDD



  1. MySQL 'OPDATERING PÅ DUBLIKAT NØGLE' uden en unik kolonne?

  2. Sletning af dubletter af rækker fra oracle

  3. Gendannelse af en mySQL-instans fra en anden brugerkonto (macOS)

  4. Tjek streng af tegn er en gyldig dato eller ej