Inserire un trigger per avere un log delle modifiche strutturali ad un database Sql Server

Spesso può essere necessario avere un log delle modifiche dei strutturali al database in uso.

con la procedura di seguito è possibile creare un trigger che scrive in una tabella di log che si chiama LogMobDB

Creazione tabella di Log dei Dati

CREATE TABLE [LogModDB](
	[data] [datetime] NULL,
	[utente] [varchar](128) NULL,
	[comando] [varchar](max) NULL,
	[objname] [varchar](128) NULL,
	[dbname] [varchar](128) NULL
);

Creazione del trigger che va a scrivere nella tabella LogModDB

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TRIGGER [Log_Modifiche_Struttura] ON DATABASE FOR
	CREATE_TABLE,
	ALTER_TABLE,
	DROP_TABLE,
	CREATE_VIEW,
	ALTER_VIEW,
	DROP_VIEW,
	CREATE_PROCEDURE,
	ALTER_PROCEDURE,
	DROP_PROCEDURE,
	CREATE_FUNCTION,
	ALTER_FUNCTION,
	DROP_FUNCTION,
	CREATE_INDEX,
	ALTER_INDEX,
	DROP_INDEX,
	CREATE_ASSEMBLY,
	ALTER_ASSEMBLY,
	DROP_ASSEMBLY,
	CREATE_TRIGGER,
	ALTER_TRIGGER,
	DROP_TRIGGER,
	CREATE_SCHEMA,
	ALTER_SCHEMA,
	DROP_SCHEMA
	AS
 
	DECLARE @command AS VARCHAR(MAX)
	DECLARE @login AS VARCHAR(128)
	DECLARE @db AS VARCHAR(128)
	DECLARE @objName AS VARCHAR(128)
	 
	SELECT @login = SUSER_SNAME()
	SELECT @command = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
	SELECT @objName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')
	SELECT @db = DB_NAME()
	 
	--Inserisco la modifica nello storico
	INSERT INTO LogModDB
		values
		(
			getdate(),
			@login,
			@command,
			@objName,
			@db
		)
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [Log_Modifiche_Struttura] ON DATABASE
GO

About Diego Mancinelli

Da sempre appassionato di informatica e tutto ciò che riaguarda l' Information Tecnology. Mi occupo di progettazione, analisi e sviluppo di software e applicazioni web per piattaforme Windows, Android, iOS

Visualizzare dimensioni tabelle in SqlServer

Può essere comodo avere un riferimento delle dimensioni delle tabelle di un database
richiamando questa store procedure si ottiene in tempo reale lo stato delle tabelle.

come si puo notare nell’immagine allegata formisce in maniera dettagliata i dati necessari.

CREATE PROCEDURE [dbo].[CalculateTableSize]
AS
BEGIN

SET NOCOUNT ON;

CREATE TABLE #FrameworkTableSize(
[TableName] [varchar](100) NULL,
[RowNumber] [int] NULL,
[KBReservedSize] varchar(100) NULL,
[KBDataSize] varchar(100) NULL,
[KBIndexSize] varchar(100) NULL,
[KBUnusedSize] varchar(100) NULL
)

declare DBObjectCursor cursor for select 'dbo.' + name from dbo.sysobjects where xtype = 'u'
declare @TableName varchar(100)

open DBObjectCursor
fetch next from DBObjectCursor into @TableName

while @@fetch_status = 0
begin
insert into #FrameworkTableSize (TableName, RowNumber , KBReservedSize, KBDataSize, KBIndexSize , KBUnusedSize)
exec sp_spaceused @TableName

fetch next from DBObjectCursor into @TableName
end

close DBObjectCursor
deallocate DBObjectCursor

SELECT * FROM #FrameworkTableSize

END

About Diego Mancinelli

Da sempre appassionato di informatica e tutto ciò che riaguarda l' Information Tecnology. Mi occupo di progettazione, analisi e sviluppo di software e applicazioni web per piattaforme Windows, Android, iOS

Confrontare due database Sql Server

Ho avuto necessita di confrontare due database Sql Server 2008 uno di produzione e uno di test e verificare che fossero perfettamente uguali.
Oltre a tanti software proprietari ho trovato su CodePlex trovato questo comodissimo tool open source.

Segnala tutte le differenze fra il primo e il secondo e ne propone il riallineamento.

Leggi tutto

About Diego Mancinelli

Da sempre appassionato di informatica e tutto ciò che riaguarda l' Information Tecnology. Mi occupo di progettazione, analisi e sviluppo di software e applicazioni web per piattaforme Windows, Android, iOS