SQL Server – DataDictionary

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Som SQL server konsult så har jag under min karriär ofta stött på databaser som saknar ett vettigt (och konsekvent) data dictionary. Avsaknaden av data dictionary tar sig ofta uttryck i databaser som innehåller tabeller med olika definitioner för samma verksamhetsbegrepp (realiserat som kolumner).

Det kan i första anblick tyckas oviktigt att ha samma definition för samma begrepp i olika tabeller, men tittar man närmare på problemet så kan man hitta ganska allvarliga konsekvenser av detta.

Några av de allvarliga negativa konsekvenserna kan vara:

  • trunkering av data
  • exceptions
  • implicit conversion, med prestandaproblem som följd

Att samma verksamhetsbegrepp förekommer i flera olika tabeller kan dessutom vara ett tecken på dålig databasdesign.

Exempel på problemet:

CREATE TABLE dbo.x(ID int IDENTITY(1,1),Val NUMERIC(4,2),NAME CHAR(10),ModificationDate DATETIME2 DEFAULT(GETDATE()));GO
CREATE TABLE dbo.y(ID int IDENTITY(1,1),Val NUMERIC(4,2),NAME VARCHAR(30),ModificationDate DATETIME DEFAULT(GETDATE()));GO
CREATE NONCLUSTERED INDEX ix_x ON dbo.x(ModificationDate)INCLUDE(val) ;GO
CREATE NONCLUSTERED INDEX ix_y ON dbo.y(ModificationDate)INCLUDE(val) ;GO

CREATE PROCEDURE dbo.getByModDate @ModificationDate DATETIME2
AS
PRINT @ModificationDate;

SELECT val FROM dbo.x WHERE ModificationDate=@ModificationDate;
SELECT val FROM dbo.y WHERE ModificationDate=@ModificationDate;
SELECT x.val,x.ModificationDate,y.val,y.ModificationDate FROM dbo.x INNER JOIN dbo.y ON dbo.y.ModificationDate=dbo.x.ModificationDate ;
GO

DECLARE @date DATETIME2=SYSDATETIME();
INSERT INTO dbo.x(Val,name,ModificationDate) VALUES(10.01,‘H.Winther’,@date);
INSERT INTO dbo.y(Val,name,ModificationDate) VALUES(10.01,‘H.Winther’,@date)
EXEC dbo.getByModDate @ModificationDate=@date

 

I det här exemplet så kommer proceduren att bara returnera 1 enda rad eftersom det sker implicita konverteringar och i dessa konvertingar så försvinner precisionen på tidsangivelsen vilket gör att det inte blir någon träff.

Problemet hade lätt kunnat undvikas om man hade gjort en ordentlig modellering av verksamhetsbegrepp och omsatt det till ett DataDictionary som kan användas för att validera datamodellen.

För att underlätta denna typ av validering så har SQL service tagit fram ett DataDictionary verktyg. Alla kolumner eller parametrar som inte finns i DataDictionary tabellen eller inte matchar datatypen kommer att rapporteras som ogiltiga.

Om du redan har en färdig/halvfärdig databas så kan du använda vårt verktyg för att samla in alla kolumner samt dess definition och lagra dem som verksamhetsbegrepp. Information om vilka tabeller som använder verksamhetsbegrepp lagras i en länkad tabell tillsammans med dess definition.

Är du intresserad av att veta mer om DataDictionary och vårt DataDictionary verktyg så är du varmt välkommen att kontakta någon av våra SQL server konsulter