Ogni oggetto indicato nella documentazione di cui sopra ha un tab dedicato alle extended properties via designer, ma è sempre possibile gestirle tramite le stored procedure di sistema dedicate:
USE Utilities;
GO
IF EXISTS(SELECT 1 FROM sys.types T WHERE name = 'tabletype1' AND schema_id = 1)
DROP TYPE dbo.tabletype1;
GO
CREATE TYPE dbo.tabletype1 AS TABLE (id int, val varchar(30));
GO
IF EXISTS(SELECT 1 FROM sys.types T WHERE name = 'tabletype2' AND schema_id = 1)
DROP TYPE dbo.tabletype2;
GO
CREATE TYPE dbo.tabletype2 AS TABLE (id int, val varchar(30), num decimal(18,2));
GO
IF EXISTS(SELECT 1 FROM sys.objects O WHERE object_id = object_id('dbo.procedure1'))
DROP PROC dbo.procedure1;
GO
CREATE PROC dbo.procedure1
AS
BEGIN
SELECT 1;
END;
GO
IF EXISTS(SELECT 1 FROM sys.objects O WHERE object_id = object_id('dbo.procedure2'))
DROP PROC dbo.procedure2;
GO
CREATE PROC dbo.procedure2
AS
BEGIN
SELECT 2;
END;
GO
IF EXISTS(SELECT 1 FROM sys.objects O WHERE object_id = object_id('dbo.function1'))
DROP FUNCTION dbo.function1;
GO
CREATE FUNCTION dbo.function1()
RETURNS int
AS
BEGIN
RETURN 1;
END;
GO
IF EXISTS(SELECT 1 FROM sys.objects O WHERE object_id = object_id('dbo.function2'))
DROP FUNCTION dbo.function2;
GO
CREATE FUNCTION dbo.function2()
RETURNS int
AS
BEGIN
RETURN 2;
END;
GO
Ora, avendo questi oggetti, andiamo a segnare come deprecati tutti quelli con suffisso 2. La naming convention per le extended properties che seguiremo nell'esempio è la seguente:
1) Nome: Utilities_Deprecation_IsDeprecated - Valore: True
2) Nome: Utilities_Deprecation_ValidUntilVersion - Valore: 2.0
3) Nome: Utilities_Deprecation_Message - Valore: This object will be removed starting from version 2.0 of the database, use the object with the same name and with a "1" suffix
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_IsDeprecated',
@value = N'True',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'PROCEDURE', @level1name = 'procedure2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_IsDeprecated',
@value = N'True',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'FUNCTION', @level1name = 'function2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_IsDeprecated',
@value = N'True',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'TYPE', @level1name = 'tabletype2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_ValidUntilVersion',
@value = N'2.0',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'PROCEDURE', @level1name = 'procedure2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_ValidUntilVersion',
@value = N'2.0',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'FUNCTION', @level1name = 'function2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_ValidUntilVersion',
@value = N'2.0',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'TYPE', @level1name = 'tabletype2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_Message',
@value = N'This
object will be removed starting from version 2.0 of the database, use the
object with the same name and with a "1" suffix',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'PROCEDURE', @level1name = 'procedure2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_Message',
@value = N'This
object will be removed starting from version 2.0 of the database, use the
object with the same name and with a "1" suffix',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'FUNCTION', @level1name = 'function2';
GO
EXEC sys.sp_addextendedproperty
@name = N'Utilities_Deprecation_Message',
@value = N'This
object will be removed starting from version 2.0 of the database, use the
object with the same name and with a "1" suffix',
@level0type = N'SCHEMA',
@level0name = 'dbo',
@level1type = N'TYPE', @level1name = 'tabletype2';
GO
Abbiamo segnato gli oggetti, ora, vogliamo tornare la lista degli oggetti deprecati, per dare un report o anche per fare da source ad un'applicazione.. Dipende dalle nostre esigenze.
Una semplice query per mostrare le extended properties senza accedere, oggetto per oggetto, alla GUI relativa, è la seguente:
SELECT
[Schema] = S.name
,
[Name] = O.name
, EP.value
FROM
sys.extended_properties EP
JOIN sys.objects O ON O.object_id = EP.major_id
JOIN sys.schemas S ON O.schema_id = S.schema_id
WHERE
EP.name
IN ('Utilities_Deprecation_IsDeprecated', 'Utilities_Deprecation_ValidUntilVersion', 'Utilities_Deprecation_Message')
UNION ALL
SELECT
[Schema] = S.name
,
[Name] = T.name
, EP.value
FROM
sys.extended_properties EP
JOIN sys.types T ON T.user_type_id
= EP.major_id
JOIN sys.schemas S ON T.schema_id = S.schema_id
WHERE
EP.name
IN ('Utilities_Deprecation_IsDeprecated', 'Utilities_Deprecation_ValidUntilVersion', 'Utilities_Deprecation_Message');
Schema Name EPName value
----------
--------------------- ------------------------------------------
--------------------------------------------------------
dbo procedure2 Utilities_Deprecation_IsDeprecated True
dbo procedure2
Utilities_Deprecation_ValidUntilVersion 2.0
dbo procedure2 Utilities_Deprecation_Message This object will be
removed starting from version 2.0...
dbo function2 Utilities_Deprecation_IsDeprecated True
dbo function2
Utilities_Deprecation_ValidUntilVersion 2.0
dbo function2 Utilities_Deprecation_Message This object will be
removed starting from version 2.0...
dbo tabletype2 Utilities_Deprecation_IsDeprecated True
dbo tabletype2
Utilities_Deprecation_ValidUntilVersion 2.0
dbo tabletype2 Utilities_Deprecation_Message This object will be
removed starting from version 2.0...
Per listare in generale le extended properties c'è anche una funzione chiamata
sys.fn_listextendedproperty, ma non consente filtri troppo personalizzati. L'esigenza nell'esempio è particolare e quindi una query dedicata risulta necessaria.
Con questo esempio abbiamo segnato come deprecati alcuni oggetti e ne abbiamo creato una lista che può essere utile ad un'applicazione esterna. Il risultato è molto importante per tenere traccia dei progressivi refactor che necessitano di retrocompatibilità ad esempio.
Con le extended properties è possibile gestire tanti casi personalizzati. Alcuni strumenti di terze parti segnano ad esempio la revisione di un database, il legame con l'eventuale source control, la documentazione, ecc.
In definitiva, esse possono essere un buon punto di partenza per inventarsi qualcosa di utile alla propria attività.
Stay Tuned!