Technical Article

Change Monitor in SQL Server 2005

,

I work in an environment where too many people have too many permissions across all of our servers from development to production. Since we do not typically go out and purchase outside software, it was my pleasure to return once again and mine SQL Server system views for the information I wanted.

I quickly found that the sys.objects table alone was not doing the trick since the modified date can update for various reasons, such as a dropped index. We often drop indices before loading data and recreate them after the load is finished. Which leads to another problem: the newly created index has a newly created object_id to go with it. Who needs to deal with ever changing object IDs? The solution is to track the true primary keys of objects and ignore object_id altogether.

The top-most level, "object", I defined thus:

server_name varchar(128) not null
,database_name varchar(128) not null
,[schema_name] varchar(50) not null
,[object_name] varchar(128) not null
,type_desc varchar(60) not null

Some column definitions were modified for the sake of my own indexes, because of the 900 byte restriction.

For object definition, we get the colid and text columns from sys.syscomments, and the primary key of the "object definition" table is expanded to include colid.

For table schema, we get the ordinal_position from both information_schema.columns (tables and views) & information_schema.routine_columns (table valued functions). So, the primary key of the "table schema" table is expanded to include ordinal_position.

The stored procedures usp_monitor_scan and usp_monitor_db_merge are the key sprocks. Scan is for your daily batch and Merge is used to initialize a newly added database monitor or to merge changes after you have had a chance to review them. This does not mean changes were prevented from happening before running the merge! The merge simply drops all the flagging and delta records created when change was observed during a Scan.

Additional notes:

The update triggers double-log both the deleted version (B for before) and the inserted version (A for after).

A few tables and the activity logging procedure were not included in the script. I leave reverse-engineering them as an exercise.

/*_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_

	VIEWS_DROP
	TABLES_DROP

	TABLES_INSERTION_POINT
	VIEWS_INSERTION_POINT


	STORED_PROCEDURES_DROP
	STORED_PROCEDURES_INSERTION_POINT


_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_*/
/*************************************************************************************************
	VIEWS_DROP
**************************************************************************************************/
USE [UTILITY]
GO

if exists ( select * from sys.objects where name = 'v_monitor_table_schema_before' and type = 'v' )
begin
	drop view dbo.[v_monitor_table_schema_before]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_table_schema_after' and type = 'v' )
begin
	drop view dbo.[v_monitor_table_schema_after]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_table_schemas_last' and type = 'v' )
begin
	drop view dbo.[v_monitor_table_schemas_last]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_object_def_jam' and type = 'v' )
begin
	drop view dbo.[v_monitor_object_def_jam]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_object_definitions' and type = 'v' )
begin
	drop view dbo.[v_monitor_object_definitions]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_object_deltas' and type = 'v' )
begin
	drop view dbo.[v_monitor_object_deltas]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_object_definition_deltas' and type = 'v' )
begin
	drop view dbo.[v_monitor_object_definition_deltas]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_configurations' and type = 'v' )
begin
	drop view dbo.[v_monitor_configurations]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_list' and type = 'v' )
begin
	drop view dbo.[v_monitor_list]
end
GO

if exists ( select * from sys.objects where name = 'v_monitor_distribution_list' and type = 'v' )
begin
	drop view dbo.[v_monitor_distribution_list]
end
GO



















/*************************************************************************************************
	TABLES_DROP
**************************************************************************************************/
USE [UTILITY]
GO

if exists ( select * from sys.objects where name = 't_monitor_table_schemas_audit' and type = 'u' )
begin
	truncate table [t_monitor_table_schemas_audit]
	drop table [t_monitor_table_schemas_audit]
end
GO

-- select * from t_monitor_table_schemas
if exists ( select * from sys.objects where name = 't_monitor_table_schemas' and type = 'u' )
begin
	truncate table [t_monitor_table_schemas]
	drop table [t_monitor_table_schemas]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_objects' and type = 'u' )
begin
	truncate table [t_monitor_objects]
	drop table [t_monitor_objects]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_object_definitions_audit' and type = 'u' )
begin
	truncate table [t_monitor_object_definitions_audit]
	drop table [t_monitor_object_definitions_audit]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_object_definitions' and type = 'u' )
begin
	truncate table [t_monitor_object_definitions]
	drop table [t_monitor_object_definitions]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_od_deltas' and type = 'u' )
begin
	truncate table [t_monitor_od_deltas]
	drop table [t_monitor_od_deltas]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_ts_deltas' and type = 'u' )
begin
	truncate table [t_monitor_ts_deltas]
	drop table [t_monitor_ts_deltas]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_facts' and type = 'u' )
begin
	truncate table [t_monitor_facts]
	drop table [t_monitor_facts]
end
GO

if exists ( select * from sys.objects where name = 't_monitor_dimensions' and type = 'u' )
begin
	truncate table [t_monitor_dimensions]
	drop table [t_monitor_dimensions]
end
GO

if exists ( select * from sys.objects where name = 't_server_database_list' and type = 'u' )
begin
	truncate table [t_server_database_list]
	drop table [t_server_database_list]
end
GO

if exists ( select * from sys.objects where name = 't_database_list' and type = 'u' )
begin
	truncate table [t_database_list]
	drop table [t_database_list]
end
GO






/*************************************************************************************************
	TABLES_INSERTION_POINT
**************************************************************************************************/
USE [UTILITY]
GO

-- alter table t_monitor_table_schemas alter column transaction_id bigint not null
-- alter table t_monitor_table_schemas alter column transaction_id int not null
create table dbo.[t_monitor_table_schemas](
	server_name varchar(128) NOT NULL
	,database_name varchar(128) NOT NULL
	,table_schema varchar(128) NOT NULL
	,table_name varchar(128) NOT NULL
	,column_name varchar(128) NOT NULL
	,ordinal_position int NOT NULL
	,constraint PK_t_monitor_table_schemas
	primary key clustered (
			server_name
			,database_name
			,table_schema
			,table_name
			,ordinal_position
	)
	,column_default nvarchar(4000) NULL
	,is_nullable varchar(3) NOT NULL
	,data_type varchar(128) NOT NULL
	,character_maximum_length int NULL
	,character_octet_length int NULL
	,numeric_precision tinyint NULL
	,numeric_precision_radix smallint NULL
	,numeric_scale int NULL
	,datetime_precision smallint NULL
	,transaction_id int not null
	,create_date datetime not null constraint DF_t_monitor_table_schemas__create_date default ( getdate() )
	,batch_date datetime not null constraint DF_t_monitor_table_schemas__batch_date default ( getdate() )
)
GO


create table dbo.[t_monitor_table_schemas_audit](
	server_name varchar(128) NOT NULL
	,database_name varchar(128) NOT NULL
	,table_schema varchar(128) NOT NULL
	,table_name varchar(128) NOT NULL
	,column_name varchar(128) NOT NULL
	,ordinal_position int NOT NULL
	,constraint PK_t_monitor_table_schemas_audit
	primary key clustered (
			server_name
			,database_name
			,table_schema
			,table_name
			,ordinal_position
			,audit_id
	)
	,column_default nvarchar(4000) NULL
	,is_nullable varchar(3) NOT NULL
	,data_type varchar(128) NOT NULL
	,character_maximum_length int NULL
	,character_octet_length int NULL
	,numeric_precision tinyint NULL
	,numeric_precision_radix smallint NULL
	,numeric_scale int NULL
	,datetime_precision smallint NULL
	,transaction_id int not null
	,create_date datetime not null
	,batch_date datetime not null
	,audit_date datetime NOT NULL CONSTRAINT DF_t_monitor_table_schemas_audit__audit_date  DEFAULT (getdate())
	,audit_id int IDENTITY(1,1) NOT NULL
	,audit_type char(1) not null
)
GO










create table dbo.[t_monitor_ts_deltas](
	server_name varchar(128) NOT NULL
	,database_name varchar(128) NOT NULL
	,table_schema varchar(128) NOT NULL
	,table_name varchar(128) NOT NULL
	,column_name varchar(128) NOT NULL
	,ordinal_position int NOT NULL
	,constraint PK_t_monitor_ts_deltas
	primary key clustered (
			server_name
			,database_name
			,table_schema
			,table_name
			,ordinal_position
			,column_name
	)
	,column_default nvarchar(4000) NULL
	,is_nullable varchar(3) NOT NULL
	,data_type varchar(128) NOT NULL
	,character_maximum_length int NULL
	,character_octet_length int NULL
	,numeric_precision tinyint NULL
	,numeric_precision_radix smallint NULL
	,numeric_scale int NULL
	,datetime_precision smallint NULL
	,batch_date datetime not null constraint DF_t_monitor_ts_deltas__change_date default ( getdate() )
)
GO




create table dbo.[t_monitor_objects] (
	server_name varchar(128) not null
	,database_name varchar(128) not null
	,[schema_name] varchar(50) not null
	,[object_name] varchar(128) not null
	,type_desc varchar(60) not null
	,constraint PK_t_monitor_objects
	primary key clustered (
		server_name
		,database_name
		,[schema_name]
		,[object_name]
		,type_desc
	)
	,batch_date datetime not null constraint DF_t_monitor_objects__change_date default ( getdate() )
	,is_active bit not null constraint DF_t_monitor_objects__is_active default ( 0x1 )
	,is_ignored bit not null constraint DF_t_monitor_objects__is_ignored default ( 0x0 )
	,is_delta bit not null constraint DF_t_monitor_objects__is_delta default ( 0x0 )
	,is_ts_delta bit not null constraint DF_t_monitor_objects__is_ts_delta default ( 0x0 )
	,is_od_delta bit not null constraint DF_t_monitor_objects__is_od_delta default ( 0x0 )
	,notes varchar(max) not null constraint DF_t_monitor_objects__notes default ( '' )
)
GO















create index IX_t_monitor_objects__is_active
on t_monitor_objects ( is_active )
GO

create index IX_t_monitor_objects__is_ignored
on t_monitor_objects ( is_ignored )
GO






create table dbo.[t_monitor_object_definitions] (
	server_name varchar(128) NOT NULL
	,database_name varchar(128) NOT NULL
	,[schema_name] varchar(50) NOT NULL
	,[object_name] varchar(128) NOT NULL
	,type_desc varchar(60) NOT NULL
	,constraint PK_t_monitor_object_definitions
	primary key clustered (
		server_name
		,database_name
		,[schema_name]
		,[object_name]
		,type_desc
		,colid
	)
	,colid smallint NOT NULL
	,[text] nvarchar(4000) NOT NULL
	,transaction_id int not null
	,create_date datetime not null constraint DF_t_monitor_object_definitions__create_date default ( getdate() )
	,batch_date datetime not null constraint DF_t_monitor_object_definitions__batch_date default ( getdate() )
)
GO



--select top 10 * from sys.objects

create table dbo.[t_monitor_object_definitions_audit] (
	server_name varchar(128) NOT NULL
	,database_name varchar(128) NOT NULL
	,[schema_name] varchar(50) NOT NULL
	,[object_name] varchar(128) NOT NULL
	,type_desc varchar(60) NOT NULL
	,constraint PK_t_monitor_object_definitions_audit
	primary key clustered (
		server_name
		,database_name
		,[schema_name]
		,[object_name]
		,type_desc
		,colid
		,audit_id
	)
	,colid smallint NOT NULL
	,[text] nvarchar(4000) NOT NULL
	,transaction_id int not null
	,create_date datetime not null
	,batch_date datetime not null
	,audit_date datetime NOT NULL CONSTRAINT DF_t_monitor_object_definitions_audit__audit_date  DEFAULT (getdate())
	,audit_id int IDENTITY(1,1) NOT NULL
	,audit_type char(1) not null
)
GO






create table dbo.[t_monitor_od_deltas] (
	server_name varchar(128) NOT NULL
	,database_name varchar(128) NOT NULL
	,[schema_name] varchar(50) NOT NULL
	,[object_name] varchar(128) NOT NULL
	,type_desc varchar(60) NOT NULL
	,constraint PK_t_monitor_od_deltas
	primary key clustered (
		server_name
		,database_name
		,[schema_name]
		,[object_name]
		,type_desc
		,colid
	)
	,colid smallint NOT NULL
	,[text] nvarchar(4000) NOT NULL
	,batch_date datetime not null constraint DF_t_monitor_od_deltas__change_date default ( getdate() )
)
GO












USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[t_database_list](
	[database_name] [sysname] NOT NULL,
	[is_active] [bit] NOT NULL CONSTRAINT [DF_t_database_list_is_active]  DEFAULT ((1)),
 CONSTRAINT [pk_t_database_list] PRIMARY KEY CLUSTERED 
(
	[database_name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]




USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[t_server_database_list](
	[server_name] [sysname] NOT NULL,
	[database_name] [sysname] NOT NULL,
	[is_active] [bit] NOT NULL CONSTRAINT [DF_t_server_database_list_is_active]  DEFAULT ((1)),
 CONSTRAINT [PK_t_server_database_list] PRIMARY KEY CLUSTERED 
(
	[server_name]
	,[database_name]
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
,CONSTRAINT [FK_t_server_database_list__server_name] FOREIGN KEY ([server_name]) references dbo.t_server_list([server_name]) 
,CONSTRAINT [FK_t_server_database_list__database_name] FOREIGN KEY ([database_name]) references dbo.t_database_list([database_name]) 
) ON [PRIMARY]
GO



create table dbo.[t_monitor_dimensions](
	dimension varchar(50) not null
	,[is_active] [bit] NOT NULL CONSTRAINT [DF_t_monitor_dimensions_is_active]  DEFAULT ((1))
	,CONSTRAINT [PK_t_monitor_dimensions] PRIMARY KEY CLUSTERED 
	(
		dimension
	)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
)
GO

insert into dbo.t_monitor_dimensions( dimension )
select dimension = 'monitor_schema'
union all select dimension = 'email_distribution'
GO





create table dbo.[t_monitor_facts](
	server_name sysname NOT NULL
	,database_name sysname NOT NULL
	,dimension varchar(50) not null
	,fact varchar(50) not null
	,[is_active] [bit] NOT NULL CONSTRAINT [DF_t_monitor_facts_is_active]  DEFAULT ((1))
	,CONSTRAINT [PK_t_monitor_facts] PRIMARY KEY CLUSTERED 
	(
		server_name
		,database_name
		,dimension
		,fact
	)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
	,CONSTRAINT [FK_t_monitor_facts__t_server_database_list] FOREIGN KEY (server_name, database_name )
		references dbo.t_server_database_list( server_name, database_name )

	,CONSTRAINT [FK_t_monitor_facts__t_monitor_dimensions] FOREIGN KEY (dimension )
		references dbo.t_monitor_dimensions( dimension )
)
GO


--select 
--	basis_key_1
--	,basis_key_2
--	-- select *
--from dbo.t_ddr_admin_lookups where lookup_group = 'monitored_databases'
--
--



























/*************************************************************************************************
	VIEWS_INSERTION_POINT
**************************************************************************************************/
USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW dbo.[v_monitor_object_deltas]
/***************************************************************************************************************************************************

Purpose:	Observe objects in a delta state.

Overview:	Objects are set to delta the first time they appear in a scan or if the underlying definition or schema has changed.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_

_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as
select
	server_name
	,database_name
	,[schema_name]
	,[object_name]
	,type_desc
	,batch_date
	,notes

from	dbo.t_monitor_objects
where	is_ignored = 0x0
and	is_delta = 0x1
-- [v_monitor_object_deltas]
GO




















USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW dbo.[v_monitor_object_definitions]
/***************************************************************************************************************************************************

Purpose:	Current object definitions.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


select * from v_monitor_object_definitions
order by
	server_name
	,database_name
	,[schema_name]
	,type_desc
	,[object_name]
	,colid


_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as
select
	MOB.server_name
	,MOB.database_name
	,MOB.[schema_name]
	,MOB.[object_name]
	,MOB.type_desc
	,object_batch_date = MOB.batch_date
	,MOB.is_active
	,MOB.is_ignored
	,MOB.is_delta
	,MOB.notes

	,OBD.colid
	,OBD.[text]
	,colid_batch_date = OBD.batch_date

from	dbo.t_monitor_objects as MOB
inner join	dbo.t_monitor_object_definitions as OBD
			on
				OBD.server_name		= MOB.server_name
			and	OBD.database_name	= MOB.database_name
			and	OBD.[schema_name]	= MOB.[schema_name]
			and	OBD.[object_name]	= MOB.[object_name]
			and	OBD.type_desc		= MOB.type_desc
-- [v_monitor_object_definitions]
GO







USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW dbo.[v_monitor_object_definition_deltas]
/***************************************************************************************************************************************************

Purpose:	Observe changed object definitions.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


select * from v_monitor_object_deltas
order by
	server_name
	,database_name
	,[schema_name]
	,type_desc
	,[object_name]
	,colid


select * from dbo.t_monitor_od_deltas


_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as
select
	MOB.server_name
	,MOB.database_name
	,MOB.[schema_name]
	,MOB.[object_name]
	,MOB.type_desc
	,object_batch_date = MOB.batch_date
	,MOB.is_active
	,MOB.is_ignored
	,MOB.is_delta
	,MOB.notes

	,ODD.colid
	,ODD.[text]
	,colid_batch_date = ODD.batch_date

from	dbo.t_monitor_objects as MOB
inner join	dbo.t_monitor_od_deltas as ODD
			on
				ODD.server_name		= MOB.server_name
			and	ODD.database_name	= MOB.database_name
			and	ODD.[schema_name]	= MOB.[schema_name]
			and	ODD.[object_name]	= MOB.[object_name]
			and	ODD.type_desc		= MOB.type_desc
-- [v_monitor_object_definition_deltas]
GO





USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW dbo.[v_monitor_object_def_jam]
/***************************************************************************************************************************************************

Purpose:	Observe deltas along-side original definitions

Overview:	For a more sophisticated comparison of specific objects, select only the old_text column with results to text,
		then copy and paste into the left field in a text comparison tool. Next, get the new_text column in the same manner
		and paste into the right field of the comparison tool.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


select * from v_monitor_object_def_jam
order by
	server_name
	,database_name
	,[schema_name]
	,type_desc
	,[object_name]
	,colid


select * from dbo.v_monitor_object_def_jam


_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as


select
	MOB.server_name
	,MOB.database_name
	,MOB.[schema_name]
	,MOB.[object_name]
	,MOB.type_desc

	,colid = MOB.colid
	,old_text = MOB.[text]
	,new_text = ODD.[text]

	,MOB.object_batch_date
	,MOB.notes

	,old_colid_batch_date = MOB.colid_batch_date
	,new_colid_batch_date = ODD.colid_batch_date


from	dbo.v_monitor_object_definitions as MOB
left join	dbo.v_monitor_object_definition_deltas as ODD
			on
				ODD.server_name		= MOB.server_name
			and	ODD.database_name	= MOB.database_name
			and	ODD.[schema_name]	= MOB.[schema_name]
			and	ODD.[object_name]	= MOB.[object_name]
			and	ODD.type_desc		= MOB.type_desc
			and	ODD.colid		= MOB.colid
where	MOB.is_ignored = 0x0
and	exists (
		select	sub.server_name
		from	dbo.v_monitor_object_definition_deltas as sub
		where
			sub.server_name		= MOB.server_name
		and	sub.database_name	= MOB.database_name
		and	sub.[schema_name]	= MOB.[schema_name]
		and	sub.[object_name]	= MOB.[object_name]
		and	sub.type_desc		= MOB.type_desc
	)
-- [v_monitor_object_def_jam]
GO









USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[v_monitor_list]
/*

select * from dbo.t_server_list
select * from dbo.t_database_list
select * from dbo.t_monitor_dimensions
select * from dbo.t_monitor_facts

*/
with schemabinding
as

select
	DAF.server_name
	,DAF.database_name

from	dbo.t_monitor_dimensions	as DAD
inner join	dbo.t_monitor_facts	as DAF on DAF.dimension = DAD.dimension
where	DAD.is_active = 0x1
and	DAF.is_active = 0x1
and	exists (
		select	sub.database_name
		from	dbo.t_database_list as sub
		where	sub.database_name = DAF.database_name
		and	sub.is_active = 0x1
	)
and	exists (
		select	sub.server_name
		from	dbo.t_server_list as sub
		where	sub.server_name = DAF.server_name
		and	sub.is_active = 0x1
	)
and	DAD.dimension = 'monitor_schema'
-- [v_monitor_list]
GO








USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[v_monitor_distribution_list]
/*

select * from v_monitor_distribution_list
select * from dbo.t_server_list
select * from dbo.t_database_list
select * from dbo.t_monitor_dimensions
select * from dbo.t_monitor_facts

*/
with schemabinding
as

select
	DAF.server_name
	,DAF.database_name
	,distribution_list = DAF.fact

from	dbo.t_monitor_dimensions	as DAD
inner join	dbo.t_monitor_facts	as DAF on DAF.dimension = DAD.dimension
where	DAD.is_active = 0x1
and	DAF.is_active = 0x1
and	exists (
		select	sub.database_name
		from	dbo.t_database_list as sub
		where	sub.database_name = DAF.database_name
		and	sub.is_active = 0x1
	)
and	exists (
		select	sub.server_name
		from	dbo.t_server_list as sub
		where	sub.server_name = DAF.server_name
		and	sub.is_active = 0x1
	)
and	DAD.dimension = 'email_distribution'
-- [v_monitor_distribution_list]
GO







USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW dbo.[v_monitor_configurations]
/*


select * from dbo.t_server_list
select * from dbo.t_database_list
select * from dbo.t_monitor_dimensions
select * from dbo.t_monitor_facts

*/
with schemabinding
as

select
	MOL.server_name
	,MOL.database_name
	,MDL.distribution_list

from	dbo.v_monitor_list			as MOL
left join	dbo.v_monitor_distribution_list	as MDL
			on MDL.server_name = MOL.server_name
			and MDL.database_name = MOL.database_name
-- [v_monitor_configurations]
GO








USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW dbo.[v_monitor_table_schemas_last]
/***************************************************************************************************************************************************

Purpose:	Shows the last version of every schema in the audit table.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_

select count(*) from t_monitor_table_schemas_audit
select count(*) from v_monitor_table_schemas_last
select count(*) from t_monitor_table_schemas

select * from v_monitor_table_schemas_last
select * from v_monitor_table_schemas_last where audit_transaction_id <> 5541
select * from v_monitor_table_schemas_last where audit_transaction_id = 5541
select * from v_monitor_table_schemas_last where audit_transaction_id > 5541


select * from t_monitor_table_schemas_audit where table_name = 'v_monitor_table_schemas_last' order by ordinal_position
select * from v_monitor_table_schemas_last where table_name = 'v_monitor_table_schemas_last' order by ordinal_position



select	*
from	dbo.t_monitor_table_schemas_audit
where	table_name = 'v_monitor_table_schemas_last'
order by ordinal_position



_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as

with LATEST_VERSION (
	server_name
	,database_name
	,table_schema
	,table_name
	,ordinal_position
	,audit_id
) as (
	select
		server_name
		,database_name
		,table_schema
		,table_name
		,ordinal_position
		,audit_id = max( audit_id )

	from	dbo.t_monitor_table_schemas_audit as AUD
	where	audit_type <> 'D'
	group by
		server_name
		,database_name
		,table_schema
		,table_name
		,ordinal_position
)
select
	server_name
	,database_name
	,table_schema
	,table_name
	,column_name
	,ordinal_position
	,column_default
	,is_nullable
	,data_type
	,character_maximum_length
	,character_octet_length
	,numeric_precision
	,numeric_precision_radix
	,numeric_scale
	,datetime_precision
	,transaction_id
	,create_date
	,batch_date
	,audit_date
	,audit_id
	,audit_type

from	dbo.t_monitor_table_schemas_audit as AUD
where	exists (
		select	sub.server_name
		from	LATEST_VERSION as sub
		where	sub.server_name		= AUD.server_name
		and	sub.database_name	= AUD.database_name
		and	sub.table_schema	= AUD.table_schema
		and	sub.table_name		= AUD.table_name
		and	sub.ordinal_position	= AUD.ordinal_position
		and	sub.audit_id		= AUD.audit_id
	)
-- [v_monitor_table_schemas_last]
GO














USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[v_monitor_table_schema_after]
/***************************************************************************************************************************************************

Purpose:	Observe new table schema deltas.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


select * from v_monitor_table_schema_after



_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as
select
	server_name
	,database_name
	,table_schema
	,table_name
	,column_name
	,ordinal_position
	,column_default
	,is_nullable
	,data_type
	,character_maximum_length
	,character_octet_length
	,numeric_precision
	,numeric_precision_radix
	,numeric_scale
	,datetime_precision

from	dbo.t_monitor_ts_deltas as MTS
where	exists (
		select	sub.server_name
		from	dbo.v_monitor_object_deltas as sub
		where	sub.server_name		= MTS.server_name
		and	sub.database_name	= MTS.database_name
		and	sub.[schema_name]	= MTS.table_schema
		and	sub.[object_name]	= MTS.table_name
	)
-- [v_monitor_table_schema_after]
GO










USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[v_monitor_table_schema_before]
/***************************************************************************************************************************************************

Purpose:	Get previous table schema for objects that have new deltas.

Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


select * from v_monitor_table_schema_after


select * from v_monitor_object_deltas

_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
--with schemabinding
with schemabinding
as
select
	server_name
	,database_name
	,table_schema
	,table_name
	,column_name
	,ordinal_position
	,column_default
	,is_nullable
	,data_type
	,character_maximum_length
	,character_octet_length
	,numeric_precision
	,numeric_precision_radix
	,numeric_scale
	,datetime_precision

from	dbo.t_monitor_table_schemas as MTS
where	exists (
		select	sub.server_name
		from	dbo.v_monitor_table_schema_after as sub
		where	sub.server_name		= MTS.server_name
		and	sub.database_name	= MTS.database_name
		and	sub.table_schema	= MTS.table_schema
		and	sub.table_name		= MTS.table_name
		and	sub.ordinal_position	= MTS.ordinal_position
	)
-- [v_monitor_table_schema_before]
GO




































/*************************************************************************************************
	STORED_PROCEDURES_DROP
**************************************************************************************************/
USE [UTILITY]
GO

if exists ( select * from sys.objects where name = 'TR_T_MONITOR_OBJECT_DEFINITIONS_DELETE' and type = 'TR' )
begin
	drop trigger [TR_T_MONITOR_OBJECT_DEFINITIONS_DELETE]
end
GO

if exists ( select * from sys.objects where name = 'TR_T_MONITOR_OBJECT_DEFINITIONS_UPDATE' and type = 'TR' )
begin
	drop trigger [TR_T_MONITOR_OBJECT_DEFINITIONS_UPDATE]
end
GO

if exists ( select * from sys.objects where name = 'TR_T_MONITOR_OBJECT_DEFINITIONS_INSERT' and type = 'TR' )
begin
	drop trigger [TR_T_MONITOR_OBJECT_DEFINITIONS_INSERT]
end
GO

if exists ( select * from sys.objects where name = 'TR_T_MONITOR_TABLE_SCHEMAS_DELETE' and type = 'TR' )
begin
	drop trigger [TR_T_MONITOR_TABLE_SCHEMAS_DELETE]
end
GO

if exists ( select * from sys.objects where name = 'TR_T_MONITOR_TABLE_SCHEMAS_UPDATE' and type = 'TR' )
begin
	drop trigger [TR_T_MONITOR_TABLE_SCHEMAS_UPDATE]
end
GO

if exists ( select * from sys.objects where name = 'TR_T_MONITOR_TABLE_SCHEMAS_INSERT' and type = 'TR' )
begin
	drop trigger [TR_T_MONITOR_TABLE_SCHEMAS_INSERT]
end
GO

if exists ( select * from sys.objects where name = 'usp_monitor_db_merge' and type = 'p' )
begin
	drop procedure [usp_monitor_db_merge]
end
GO

if exists ( select * from sys.objects where name = 'usp_monitor_scan' and type = 'p' )
begin
	drop procedure [usp_monitor_scan]
end
GO

if exists ( select * from sys.objects where name = 'usp_monitor_pit_tables' and type = 'p' )
begin
	drop procedure [usp_monitor_pit_tables]
end
GO

if exists ( select * from sys.objects where name = 'usp_monitor_pit_objects' and type = 'p' )
begin
	drop procedure [usp_monitor_pit_objects]
end
GO









/*************************************************************************************************
	STORED_PROCEDURES_INSERTION_POINT
**************************************************************************************************/
USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_monitor_pit_objects](
	@server_name varchar(128) = null
	,@database_name varchar(128) = null
	,@schema_name varchar(128) = null
	,@object_name varchar(128)
	,@batch_date datetime
)
/***************************************************************************************************************************************************

Purpose:	Get point in time view of object definitions

Modified:
    20090615  David Korb Created.


***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


EXEC dbo.usp_monitor_pit_objects
	@server_name = null
	,@database_name = null
	,@schema_name = null
	,@object_name = 'v_monitor_table_schemas_last'
	,@batch_date = '2009-06-20 12:21:53.013'




_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	select
		server_name
		,database_name
		,[schema_name]
		,[object_name]
		,type_desc
		,colid
		,[text]
		,transaction_id
		,create_date
		,batch_date
		,audit_date
		,audit_id
		,audit_type

	from	dbo.t_monitor_object_definitions_audit
	where
		audit_id in (
			select	max( sub.audit_id )
			from	dbo.t_monitor_object_definitions_audit as sub
			where
				sub.audit_type not in ( 'B', 'D' )
			and	sub.server_name = coalesce( @server_name, sub.server_name )
			and	sub.database_name = coalesce( @database_name, sub.database_name )
			and	sub.[schema_name] = coalesce( @schema_name, sub.[schema_name] )
			and	sub.[object_name] = @object_name
			and	sub.batch_date <= @batch_date
			group by
				sub.server_name
				,sub.database_name
				,sub.[schema_name]
				,sub.[object_name]
				,sub.colid
		)
	order by
		server_name
		,database_name
		,[object_name]
		,[schema_name]
		,colid
	return @@error
end -- [usp_monitor_pit_objects]
GO


USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_monitor_pit_tables](
	@server_name varchar(128) = null
	,@database_name varchar(128) = null
	,@table_schema varchar(128) = null
	,@table_name varchar(128)
	,@batch_date datetime
)
/***************************************************************************************************************************************************

Purpose:	Get point in time view table schema

Modified:
    20090615  David Korb Created.


***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_


EXEC dbo.usp_monitor_pit_tables
	@server_name = null
	,@database_name = null
	,@table_schema = null
	,@table_name = 'v_monitor_table_schemas_last'
	,@batch_date = '2009-06-20 12:21:53.013'




_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	select
		server_name
		,database_name
		,table_schema
		,table_name
		,column_name
		,ordinal_position
		,column_default
		,is_nullable
		,data_type
		,character_maximum_length
		,character_octet_length
		,numeric_precision
		,numeric_precision_radix
		,numeric_scale
		,datetime_precision
		,transaction_id
		,create_date
		,batch_date
		,audit_date
		,audit_id
		,audit_type

	from	dbo.t_monitor_table_schemas_audit
	where
		audit_id in (
			select	max( sub.audit_id )
			from	dbo.t_monitor_table_schemas_audit as sub
			where
				sub.audit_type not in ( 'B', 'D' )
			and	sub.server_name = coalesce( @server_name, sub.server_name )
			and	sub.database_name = coalesce( @database_name, sub.database_name )
			and	sub.table_schema = coalesce( @table_schema, sub.table_schema )
			and	sub.table_name = @table_name
			and	sub.batch_date <= @batch_date
			group by
				sub.server_name
				,sub.database_name
				,sub.table_schema
				,sub.table_name
				,sub.ordinal_position
		)
	order by
		server_name
		,database_name
		,table_schema
		,table_name
		,ordinal_position
	return @@error
end -- [usp_monitor_pit_tables]
GO


















USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_monitor_scan]
(
	@transaction_id int = 0
	,@system_date datetime = null
	,@output_print int = 0
	,@test_run int = 0
)
/***************************************************************************************************************************************************

Purpose:	Daily batch to scan for change.

Overview:	Scans monitored DBs for changes in object definitions in the system view, sys.syscomments, and
		changes to table schema found in the information_schema.columns (tables and views) and
		information_schema.routine_columns (table valued functions) system views.

Modified:
    20090615  David Korb Created.


***************************************************************************************************************************************************/
/*_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_

	DECLARE_VARIABLES

	GET_DATABASES
	GET_OBJECTS
	GET_OBJECT_DEFINITIONS
	GET_TABLE_SCHEMA

	DE_ACTIVATE_MISSING_OBJECTS
	RE_CREATED_RE_ACTIVATED_OBJECTS

	INSERT_NEW_OBJECTS
	INSERT_OBJECT_DEFINITION_DELTAS
	INSERT_TABLE_SCHEMA_DELTAS

	FLAG_OBJECT_DEFINITIONS_HAVING_DELTAS
	FLAG_TABLE_OBJECTS_HAVING_DELTAS

	LOG_THE_ERROR_RAISE_THE_ERROR_AND_RETURN


_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_*/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
select * from dbo.SNAP_WCV_SOURCE_SYSTEM_MASTER

exec dbo.usp_monitor_scan
		@output_print = 1
		,@test_run = 1






_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin


	/**************************************************************************************************
		DECLARE_VARIABLES
	***************************************************************************************************/
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(2048)

	declare @sql_string varchar(4000)
	declare @counter int
	declare @cr_lf char(2)

	declare @default_severity int
	declare @server_name sysname
	declare @database_name sysname
	declare @procedure_name sysname
	declare @table_name sysname
	declare @activity varchar(255)
	declare @row_count int


	select @cr_lf = char(13) + char(10)



	if @test_run = 1 and @output_print = 1
	begin
		set @output_print = 0
	end


	create table #_ums_servers_databases (
		id int identity
		,server_name sysname NOT NULL
		,database_name sysname NOT NULL
	)

	-- select * from #_ums_objects
	create table #_ums_objects (
		server_name varchar(128) not null
		,database_name varchar(128) not null
		,[schema_name] varchar(50) not null
		,[object_name] varchar(128) not null
		,type_desc varchar(60) not null
	)

	create table #_ums_object_definitions (
		server_name varchar(128) NOT NULL
		,database_name varchar(128) NOT NULL
		,[schema_name] varchar(50) NOT NULL
		,[object_name] varchar(128) NOT NULL
		,type_desc varchar(60) NOT NULL
		,colid smallint NOT NULL
		,[text] nvarchar(4000) NOT NULL
	)

	create table #_ums_monitor_table_schema(
		server_name varchar(128) NOT NULL
		,database_name varchar(128) NOT NULL
		,table_schema varchar(128) NOT NULL
		,table_name varchar(128) NOT NULL
		,column_name varchar(128) NOT NULL
		,ordinal_position int NOT NULL
		,column_default nvarchar(4000) NULL
		,is_nullable varchar(3) NOT NULL
		,data_type varchar(128) NOT NULL
		,character_maximum_length int NULL
		,character_octet_length int NULL
		,numeric_precision tinyint NULL
		,numeric_precision_radix smallint NULL
		,numeric_scale int NULL
		,datetime_precision smallint NULL
	)



	select @system_date = coalesce( @system_date, current_timestamp )
	select @procedure_name =  OBJECT_NAME( @@PROCID )




	set @activity = 'BEGIN______' + upper( @procedure_name )
	exec dbo.usp_util_activity_logging
					@transaction_id = @transaction_id output
					,@procedure_name = @procedure_name
					,@activity = @activity
					,@output_print = @output_print




	select @activity = 'Get server database list'
	insert into #_ums_servers_databases ( server_name, database_name )
	select
		server_name
		,database_name

		-- select *
	from	dbo.v_monitor_configurations


	create unique clustered index IX_#_ums_servers_databases
	on #_ums_servers_databases ( server_name, database_name )




	/**************************************************************************************************
		GET_OBJECTS
	***************************************************************************************************/
	select @counter = 1, @row_count = count(*) from #_ums_servers_databases

	while @counter <= @row_count
	begin
		select
			@server_name = server_name
			,@database_name = database_name
		from	#_ums_servers_databases
		where	id = @counter



		set @activity = 'EXEC ( @sql_string ): insert #_ums_objects'
		set @sql_string = ''

		set @sql_string = 'insert into #_ums_objects (
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
		) ' + char(13)
		set @sql_string = @sql_string + 
'
	select
		server_name = ''' + @server_name + '''
		,database_name = ''' + @database_name + '''
		,[schema_name] = SCH.[name]
		,[object_name] = SOB.[name]
		,SOB.type_desc

	from	[' + @server_name + '].[' + @database_name +  '].sys.schemas as SCH with (nolock)
	inner join	[' + @server_name + '].[' + @database_name +  '].sys.objects SOB with (nolock) on SOB.[schema_id] = SCH.[schema_id]
	where	SOB.is_ms_shipped = 0
'
		if @test_run = 1
		begin
			print @sql_string
		end
		else
		begin
			begin try
				execute ( @sql_string )
			end try
			begin catch
				select @activity = @activity + ' against server: [' + @server_name + ']'
				goto log_error
			end catch
		end

		set @counter = @counter + 1
	end
	select @row_count = count(*), @table_name = '#_ums_objects' from #_ums_objects
	exec dbo.usp_util_activity_logging
					@transaction_id		= @transaction_id
					,@procedure_name	= @procedure_name
					,@table_name		= @table_name
					,@activity		= @activity
					,@dml_type		= 'I'
					,@row_count		= @row_count
					,@output_print		= @output_print



	begin try
		select @activity = 'Create unique clustered index on #_ums_objects'
		create unique clustered index IX_#_ums_objects
		on #_ums_objects (
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
		)
	end try
	begin catch
		goto log_error
	end catch



	/**************************************************************************************************
		GET_OBJECT_DEFINITIONS
	***************************************************************************************************/
	select @counter = 1, @row_count = count(*) from #_ums_servers_databases

	while @counter <= @row_count
	begin
		select
			@server_name = server_name
			,@database_name = database_name
		from	#_ums_servers_databases
		where	id = @counter

		set @activity = 'EXEC ( @sql_string ): insert #_ums_object_definitions'
		set @sql_string = ''
		set @sql_string = 'insert into #_ums_object_definitions (
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
		) ' + char(13)
		set @sql_string = @sql_string + 
'
	select
		server_name = ''' + @server_name + '''
		,database_name = ''' + @database_name + '''
		,[schema_name] = SCH.[name]
		,[object_name] = SOB.[name]
		,SOB.type_desc
		,SCO.colid
		,SCO.[text]

	from	[' + @server_name + '].[' + @database_name +  '].sys.schemas as SCH with (nolock)
	inner join	[' + @server_name + '].[' + @database_name +  '].sys.objects SOB with (nolock) on SOB.[schema_id] = SCH.[schema_id]
	inner join	[' + @server_name + '].[' + @database_name +  '].sys.syscomments SCO with (nolock) on SCO.id = SOB.[object_id]
	where	SOB.is_ms_shipped = 0
'
		if @test_run = 1
		begin
			print @sql_string
		end
		else
		begin
			begin try
				execute ( @sql_string )
			end try
			begin catch
				select @activity = @activity + ' against server: [' + @server_name + ']'
				goto log_error
			end catch
		end

		set @counter = @counter + 1
	end
	select @row_count = count(*), @table_name = '#_ums_object_definitions' from #_ums_object_definitions
	exec dbo.usp_util_activity_logging
					@transaction_id		= @transaction_id
					,@procedure_name	= @procedure_name
					,@table_name		= @table_name
					,@activity		= @activity
					,@dml_type		= 'I'
					,@row_count		= @row_count
					,@output_print		= @output_print


	begin try
		select @activity = 'Create unique clustered index on #_ums_object_definitions'
		create unique clustered index IX_#_ums_object_definitions
		on #_ums_object_definitions (
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
		)
	end try
	begin catch
		goto log_error
	end catch



	/**************************************************************************************************
		GET_TABLE_SCHEMA
	***************************************************************************************************/
	select @counter = 1, @row_count = count(*) from #_ums_servers_databases

	while @counter <= @row_count
	begin
		select
			@server_name = server_name
			,@database_name = database_name
		from	#_ums_servers_databases
		where	id = @counter

		set @activity = 'EXEC ( @sql_string ): insert #_ums_monitor_table_schema'
		set @sql_string = ''
		set @sql_string = 'insert into #_ums_monitor_table_schema (
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
		) ' + char(13)
		set @sql_string = @sql_string + 
'
	select
		server_name = ''' + @server_name + '''
		,database_name = ''' + @database_name + '''
		,table_schema = cast( TABLE_SCHEMA as varchar(128) )
		,table_name = cast( table_name as varchar(128) )
		,column_name = cast( column_name as varchar(128) )
		,ordinal_position
		,column_default = cast( column_default as varchar(max))
		,is_nullable
		,data_type = cast( data_type as varchar(128) )
		,character_maximum_length
		,character_octet_length
		,numeric_precision
		,numeric_precision_radix
		,numeric_scale
		,datetime_precision

	from	[' + @server_name + '].[' + @database_name +  '].information_schema.columns
union all
	select
		server_name = ''' + @server_name + '''
		,database_name = ''' + @database_name + '''
		,table_schema = cast( TABLE_SCHEMA as varchar(128) )
		,table_name = cast( table_name as varchar(128) )
		,column_name = cast( column_name as varchar(128) )
		,ordinal_position
		,column_default = cast( column_default as varchar(max))
		,is_nullable
		,data_type = cast( data_type as varchar(128) )
		,character_maximum_length
		,character_octet_length
		,numeric_precision
		,numeric_precision_radix
		,numeric_scale
		,datetime_precision
	from	[' + @server_name + '].[' + @database_name +  '].information_schema.routine_columns

'
		if @test_run = 1
		begin
			print @sql_string
		end
		else
		begin
			begin try
				execute ( @sql_string )
			end try
			begin catch
				select @activity = @activity + ' against server: [' + @server_name + ']'
				goto log_error
			end catch
		end

		set @counter = @counter + 1
	end
	select @row_count = count(*), @table_name = '#_ums_monitor_table_schema' from #_ums_monitor_table_schema
	exec dbo.usp_util_activity_logging
					@transaction_id		= @transaction_id
					,@procedure_name	= @procedure_name
					,@table_name		= @table_name
					,@activity		= @activity
					,@dml_type		= 'I'
					,@row_count		= @row_count
					,@output_print		= @output_print




	begin try
		select @activity = 'Create unique clustered index on #_ums_monitor_table_schema'
		create unique clustered index IX_#_ums_monitor_table_schema
		on #_ums_monitor_table_schema (
			server_name
			,database_name
			,table_schema
			,table_name
			,ordinal_position
			,column_name
		)
	end try
	begin catch
		goto log_error
	end catch




	if @test_run = 1 goto test_run

	/**************************************************************************************************
		DE_ACTIVATE_MISSING_OBJECTS
	***************************************************************************************************/
	-- select count(*) from sys.objects
	begin try
		select @activity = 'Update to inactive'

		-- select * from dbo.t_monitor_objects where is_active = 0

		-- declare @system_date datetime, @cr_lf char(2); select @system_date = getdate(),@cr_lf = char(13) + char(10)
		update	DOB
		set
			DOB.batch_date = @system_date
			,DOB.is_active = 0x0
			,DOB.is_delta = 0x1
			,DOB.notes =
				convert( varchar, @system_date, 121 )
				+ ' -- Object not found: set to inactive.' + @cr_lf + @cr_lf
				+ DOB.notes

			-- select count(*) -- select *
		from	dbo.t_monitor_objects as DOB
		where	not exists (
				select	*
				from	#_ums_objects	as sub
				where
					sub.server_name  = DOB.server_name
				and	sub.database_name = DOB.database_name
				and	sub.[schema_name] = DOB.[schema_name]
				and	sub.[object_name] = DOB.[object_name]
				and	sub.type_desc = DOB.type_desc
			)
		and	DOB.is_active = 0x1
		and	DOB.is_ignored = 0x0
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'U'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch






	/**************************************************************************************************
		RE_CREATED_RE_ACTIVATED_OBJECTS
	***************************************************************************************************/
	begin try
		select @activity = 'Update object recreated-reactivated'
		-- declare @system_date datetime, @cr_lf char(2); select @system_date = getdate(),@cr_lf = char(13) + char(10)
		update	DOB
		set
			DOB.batch_date = @system_date
			,DOB.is_active = 0x1
			,DOB.is_delta = 0x1
			,DOB.notes =
				convert( varchar, @system_date, 121 )
				+ ' -- Reanimated object: flagged active.' + @cr_lf + @cr_lf
				+ DOB.notes

			-- select count(*) -- select *
		from	dbo.t_monitor_objects		as DOB
		inner join	#_ums_objects	as dub on dub.server_name  = DOB.server_name
								and	dub.database_name = DOB.database_name
								and	dub.[schema_name] = DOB.[schema_name]
								and	dub.[object_name] = DOB.[object_name]
								and	dub.type_desc = DOB.type_desc
		where	DOB.is_active = 0x0
		and	DOB.is_ignored = 0x0
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'U'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch








	/**************************************************************************************************
		INSERT_NEW_OBJECTS
	***************************************************************************************************/
	begin try
		select @activity = 'Insert objects'
		insert into dbo.t_monitor_objects(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,is_delta
			,notes
		)
		select
			OBJ.server_name
			,OBJ.database_name
			,OBJ.[schema_name]
			,OBJ.[object_name]
			,OBJ.type_desc

			-- New objects are deltas that require attention.
			,is_delta = 0x1
			,notes = '-- New object appearance: flagged delta.'

			-- select *
		from	#_ums_objects as OBJ
		where	not exists (
				select	*
				from	dbo.t_monitor_objects as sub
				where	sub.server_name		= OBJ.server_name
				and	sub.database_name	= OBJ.database_name
				and	sub.[schema_name]	= OBJ.[schema_name]
				and	sub.[object_name]	= OBJ.[object_name]
				and	sub.type_desc		= OBJ.type_desc
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'I'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch




	/**************************************************************************************************
		INSERT_OBJECT_DEFINITION_DELTAS
	***************************************************************************************************/
	begin try
		-- 
		-- select * from dbo.t_monitor_od_deltas
		-- 


		select @activity = 'Insert definition deltas'
		insert into dbo.t_monitor_od_deltas(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
		)
		select
			TOD.server_name
			,TOD.database_name
			,TOD.[schema_name]
			,TOD.[object_name]
			,TOD.type_desc
			,TOD.colid
			,TOD.[text]

			-- select *
		from	#_ums_object_definitions as TOD
		where	not exists (
				select	*
				from	dbo.t_monitor_od_deltas as sub
				where
					sub.server_name		= TOD.server_name
				and	sub.database_name	= TOD.database_name
				and	sub.[schema_name]	= TOD.[schema_name]
				and	sub.[object_name]	= TOD.[object_name]
				and	sub.type_desc		= TOD.type_desc
				and	sub.colid		= TOD.colid
			)
		and	not exists (
				select	*
				from	dbo.t_monitor_object_definitions as OBD
				where
					OBD.server_name		= TOD.server_name
				and	OBD.database_name	= TOD.database_name
				and	OBD.[schema_name]	= TOD.[schema_name]
				and	OBD.[object_name]	= TOD.[object_name]
				and	OBD.type_desc		= TOD.type_desc
				and	OBD.colid		= TOD.colid
				and	OBD.[text]		= TOD.[text]
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_od_deltas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'I'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch









	/**************************************************************************************************
		INSERT_TABLE_SCHEMA_DELTAS
	***************************************************************************************************/
	begin try
		-- select * from dbo.t_monitor_ts_deltas


		select @activity = 'Insert table deltas'
		insert into dbo.t_monitor_ts_deltas(
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
		)
		select
			TTS.server_name
			,TTS.database_name
			,TTS.table_schema
			,TTS.table_name
			,TTS.column_name
			,TTS.ordinal_position
			,TTS.column_default
			,TTS.is_nullable
			,TTS.data_type
			,TTS.character_maximum_length
			,TTS.character_octet_length
			,TTS.numeric_precision
			,TTS.numeric_precision_radix
			,TTS.numeric_scale
			,TTS.datetime_precision

			-- select *
		from	#_ums_monitor_table_schema as TTS
		where
			not exists (
				select	*
				from	dbo.t_monitor_ts_deltas as sub
				where
					sub.server_name			= TTS.server_name
				and	sub.database_name		= TTS.database_name
				and	sub.table_schema		= TTS.table_schema
				and	sub.table_name			= TTS.table_name
				and	sub.ordinal_position		= TTS.ordinal_position
				and	sub.column_name			= TTS.column_name
			)
		and	not exists (
				select	*
				from	dbo.t_monitor_table_schemas as MTS
				where	MTS.server_name		= TTS.server_name
				and	MTS.database_name	= TTS.database_name
				and	MTS.table_schema	= TTS.table_schema
				and	MTS.table_name		= TTS.table_name
				and	MTS.ordinal_position	= TTS.ordinal_position
				and	MTS.column_name		= TTS.column_name
				and	MTS.is_nullable		= TTS.is_nullable
				and	MTS.data_type		= TTS.data_type

				and ( MTS.column_default is null AND TTS.column_default is null
					OR MTS.column_default = TTS.column_default
				)
				and ( MTS.character_maximum_length is null AND TTS.character_maximum_length is null
					OR MTS.character_maximum_length = TTS.character_maximum_length
				)
				and ( MTS.character_octet_length is null AND TTS.character_octet_length is null
					OR MTS.character_octet_length = TTS.character_octet_length
				)
				and ( MTS.numeric_precision is null AND TTS.numeric_precision is null
					OR MTS.numeric_precision = TTS.numeric_precision
				)
				and ( MTS.numeric_precision_radix is null AND TTS.numeric_precision_radix is null
					OR MTS.numeric_precision_radix = TTS.numeric_precision_radix
				)
				and ( MTS.numeric_scale is null AND TTS.numeric_scale is null
					OR MTS.numeric_scale = TTS.numeric_scale
				)
				and ( MTS.datetime_precision is null AND TTS.datetime_precision is null
					OR MTS.datetime_precision = TTS.datetime_precision
				)
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_ts_deltas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'I'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch



	/**************************************************************************************************
		FLAG_OBJECT_DEFINITIONS_HAVING_DELTAS
	***************************************************************************************************/
	begin try

		--
		-- select top 100 * from dbo.t_monitor_table_schemas
		--
		-- select top 100 * from dbo.t_monitor_table_schemas
		--

		select @activity = 'Update deltad object definitions'
		-- declare @system_date datetime, @cr_lf char(2); select @system_date = getdate(),@cr_lf = char(13) + char(10)
		update	MOB
		set
			MOB.batch_date = @system_date
			,MOB.is_delta = 0x1
			,MOB.is_od_delta = 0x1
			,MOB.notes =
				case
					when MOB.is_delta = 0x0
					then
						convert( varchar, @system_date, 121 )
						+ ' -- Changed object definition: flagged od delta.' + @cr_lf + @cr_lf
					else ''
				end
				+ MOB.notes

			-- select count(*) -- select *
		from	dbo.t_monitor_objects as MOB
		where	MOB.is_ignored = 0x0
		and	MOB.is_od_delta = 0x0
		and	exists (
				select	*
				from	dbo.t_monitor_od_deltas	 as ODD
				where	ODD.server_name		= MOB.server_name
				and	ODD.database_name	= MOB.database_name
				and	ODD.[schema_name]	= MOB.[schema_name]
				and	ODD.[object_name]	= MOB.[object_name]
				and	ODD.type_desc		= MOB.type_desc
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'U'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch




	/**************************************************************************************************
		FLAG_TABLE_OBJECTS_HAVING_DELTAS
	***************************************************************************************************/
	begin try

		--
		-- select top 100 * from dbo.t_monitor_table_schemas
		--
		-- select top 100 * from dbo.t_monitor_table_schemas
		--

		select @activity = 'Update deltad table objects'
		-- declare @system_date datetime, @cr_lf char(2); select @system_date = getdate(),@cr_lf = char(13) + char(10)
		update	MOB
		set
			MOB.batch_date = @system_date
			,MOB.is_delta = 0x1
			,MOB.is_ts_delta = 0x1
			,MOB.notes =
				case
					when MOB.is_delta = 0x0
					then
						convert( varchar, @system_date, 121 )
						+ ' -- Changed table schema: flagged ts delta.' + @cr_lf + @cr_lf
					else ''
				end
				+ MOB.notes

			-- select count(*) -- select *
		from	dbo.t_monitor_objects as MOB
		where	MOB.is_ignored = 0x0
		and	MOB.is_ts_delta = 0x0
		and	exists (
				select	*
				from	dbo.t_monitor_ts_deltas as TSD
				where	TSD.server_name		= MOB.server_name
				and	TSD.database_name	= MOB.database_name
				and	TSD.table_schema	= MOB.[schema_name]
				and	TSD.table_name		= MOB.[object_name]
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'U'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch






test_run:
	/**************************************************************************************************
		THE_END
	***************************************************************************************************/
	set @activity = 'END________' + upper( @procedure_name )
	exec dbo.usp_util_activity_logging
					@transaction_id = @transaction_id
					,@procedure_name = @procedure_name
					,@activity = @activity
					,@output_print = @output_print


	return @@error

	/**************************************************************************************************
		LOG_THE_ERROR_RAISE_THE_ERROR_AND_RETURN
	***************************************************************************************************/
log_error:
	select @activity = 'Error: ' + @activity

	exec dbo.usp_util_activity_logging
				@transaction_id		= @transaction_id
				,@procedure_name	= @procedure_name
				,@activity		= @activity
				,@error_number		= @error_number output
				,@error_severity	= @error_severity output
				,@error_state		= @error_state output
				,@error_message		= @error_message output
				,@output_print		= @output_print

	select @error_message = @activity + '::' + @error_message

	raiserror ( @error_message, @error_severity, @error_state ) with nowait
	return @error_number


end -- [usp_monitor_scan]
GO








USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_monitor_db_merge]
(
	@transaction_id int = 0
	,@server_name sysname = null
	,@database_name sysname = null
	,@system_date datetime = null
	,@output_print int = 0
	,@test_run int = 0
)
/***************************************************************************************************************************************************

Purpose:	For a given monitored DB, merge all new definitions and schemas into the monitor database. This resets the monitor
		and stops email alerts, at least until another object is modified.

Modified:
    20090615  David Korb Created.


***************************************************************************************************************************************************/
/*_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_

	DECLARE_VARIABLES

	GET_OBJECTS
	GET_OBJECT_DEFINITIONS
	GET_TABLE_SCHEMA

	DELETE_OD_DELTAS
	DELETE_TS_DELTAS

	DELETE_OBJECTS
	INSERT_OBJECTS

	DELETE_OBJECT_MISSING_DEFINITIONS
	UPDATE_OBJECT_DEFINITION_TEXT_DELTAS
	INSERT_NEW_OBJECT_DEFINITIONS

	DELETE_MISSING_TABLE_SKHEMAS
	UPDATE_CHANGED_TABLE_SKHEMAS
	INSERT_NEW_TABLE_SKHEMAS

	LOG_THE_ERROR_RAISE_THE_ERROR_AND_RETURN


_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_TABLE_OF_CONTENTS_*/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_

exec dbo.usp_monitor_db_merge
		@server_name = 'WSWZP4254'
		,@database_name = 'ICM_PROCESS'
		,@output_print = 1
		,@test_run = 1






_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin


	/**************************************************************************************************
		DECLARE_VARIABLES
	***************************************************************************************************/
	declare @default_error int
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(2048)

	declare @sql_string varchar(4000)
	declare @counter int
	declare @cr_lf char(2)

	declare @procedure_name sysname
	declare @table_name sysname
	declare @activity varchar(255)
	declare @row_count int


	select @cr_lf = char(13) + char(10), @default_error = 50001
	select @system_date = coalesce( @system_date, current_timestamp )
	select @procedure_name =  OBJECT_NAME( @@PROCID )




	if @test_run = 1 and @output_print = 1
	begin
		set @output_print = 0
	end



	-- select * from #_mdm_objects
	create table #_mdm_objects (
		server_name varchar(128) not null
		,database_name varchar(128) not null
		,[schema_name] varchar(50) not null
		,[object_name] varchar(128) not null
		,type_desc varchar(60) not null
	)

	create table #_mdm_object_definitions (
		server_name varchar(128) NOT NULL
		,database_name varchar(128) NOT NULL
		,[schema_name] varchar(50) NOT NULL
		,[object_name] varchar(128) NOT NULL
		,type_desc varchar(60) NOT NULL
		,colid smallint NOT NULL
		,[text] nvarchar(4000) NOT NULL
	)

	create table #_mdm_monitor_table_schema(
		server_name varchar(128) NOT NULL
		,database_name varchar(128) NOT NULL
		,table_schema varchar(128) NOT NULL
		,table_name varchar(128) NOT NULL
		,column_name varchar(128) NOT NULL
		,ordinal_position int NOT NULL
		,column_default nvarchar(4000) NULL
		,is_nullable varchar(3) NOT NULL
		,data_type varchar(128) NOT NULL
		,character_maximum_length int NULL
		,character_octet_length int NULL
		,numeric_precision tinyint NULL
		,numeric_precision_radix smallint NULL
		,numeric_scale int NULL
		,datetime_precision smallint NULL
	)





	set @activity = 'BEGIN______' + upper( @procedure_name )
	exec dbo.usp_util_activity_logging
					@transaction_id = @transaction_id output
					,@procedure_name = @procedure_name
					,@activity = @activity
					,@output_print = @output_print




	if not exists(
		select	*
		from	dbo.v_monitor_configurations
		where	server_name = @server_name
		and	database_name = @database_name
	)
	begin
		select @error_number = @default_error
		goto log_error
	end





	/**************************************************************************************************
		GET_OBJECTS
	***************************************************************************************************/
	set @activity = 'EXEC ( @sql_string ): insert #_mdm_objects'
	set @sql_string = ''

	set @sql_string = 'insert into #_mdm_objects (
	server_name
	,database_name
	,[schema_name]
	,[object_name]
	,type_desc
) ' + char(13)
	set @sql_string = @sql_string + 
'
select
	server_name = ''' + @server_name + '''
	,database_name = ''' + @database_name + '''
	,[schema_name] = SCH.[name]
	,[object_name] = SOB.[name]
	,SOB.type_desc

from	[' + @server_name + '].[' + @database_name +  '].sys.schemas as SCH with (nolock)
inner join	[' + @server_name + '].[' + @database_name +  '].sys.objects SOB with (nolock) on SOB.[schema_id] = SCH.[schema_id]
where	SOB.is_ms_shipped = 0
'
	if @test_run = 1
	begin
		print @sql_string
	end
	else
	begin
		begin try
			execute ( @sql_string )
		end try
		begin catch
			select @activity = @activity + ' against server: [' + @server_name + ']'
			goto log_error
		end catch
	end
	select @row_count = count(*), @table_name = '#_mdm_objects' from #_mdm_objects
	exec dbo.usp_util_activity_logging
					@transaction_id		= @transaction_id
					,@procedure_name	= @procedure_name
					,@table_name		= @table_name
					,@activity		= @activity
					,@dml_type		= 'I'
					,@row_count		= @row_count
					,@output_print		= @output_print



	begin try
		select @activity = 'Create unique clustered index on #_mdm_objects'
		create unique clustered index IX_#_mdm_objects
		on #_mdm_objects (
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
		)
	end try
	begin catch
		goto log_error
	end catch



	/**************************************************************************************************
		GET_OBJECT_DEFINITIONS
	***************************************************************************************************/
	set @activity = 'EXEC ( @sql_string ): insert #_mdm_object_definitions'
	set @sql_string = ''
	set @sql_string = 'insert into #_mdm_object_definitions (
		server_name
		,database_name
		,[schema_name]
		,[object_name]
		,type_desc
		,colid
		,[text]
	) ' + char(13)
	set @sql_string = @sql_string + 
'
select
	server_name = ''' + @server_name + '''
	,database_name = ''' + @database_name + '''
	,[schema_name] = SCH.[name]
	,[object_name] = SOB.[name]
	,SOB.type_desc
	,SCO.colid
	,SCO.[text]

from	[' + @server_name + '].[' + @database_name +  '].sys.schemas as SCH with (nolock)
inner join	[' + @server_name + '].[' + @database_name +  '].sys.objects SOB with (nolock) on SOB.[schema_id] = SCH.[schema_id]
inner join	[' + @server_name + '].[' + @database_name +  '].sys.syscomments SCO with (nolock) on SCO.id = SOB.[object_id]
where	SOB.is_ms_shipped = 0
'
	if @test_run = 1
	begin
		print @sql_string
	end
	else
	begin
		begin try
			execute ( @sql_string )
		end try
		begin catch
			select @activity = @activity + ' against server: [' + @server_name + ']'
			goto log_error
		end catch
	end
	select @row_count = count(*), @table_name = '#_mdm_object_definitions' from #_mdm_object_definitions
	exec dbo.usp_util_activity_logging
					@transaction_id		= @transaction_id
					,@procedure_name	= @procedure_name
					,@table_name		= @table_name
					,@activity		= @activity
					,@dml_type		= 'I'
					,@row_count		= @row_count
					,@output_print		= @output_print


	begin try
		select @activity = 'Create unique clustered index on #_mdm_object_definitions'
		create unique clustered index IX_#_mdm_object_definitions
		on #_mdm_object_definitions (
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
		)
	end try
	begin catch
		goto log_error
	end catch



	/**************************************************************************************************
		GET_TABLE_SCHEMA
	***************************************************************************************************/
	set @activity = 'EXEC ( @sql_string ): insert #_mdm_monitor_table_schema'
	set @sql_string = ''
	set @sql_string = 'insert into #_mdm_monitor_table_schema (
		server_name
		,database_name
		,table_schema
		,table_name
		,column_name
		,ordinal_position
		,column_default
		,is_nullable
		,data_type
		,character_maximum_length
		,character_octet_length
		,numeric_precision
		,numeric_precision_radix
		,numeric_scale
		,datetime_precision
	) ' + char(13)
	set @sql_string = @sql_string + 
'
select
	server_name = ''' + @server_name + '''
	,database_name = ''' + @database_name + '''
	,table_schema = cast( TABLE_SCHEMA as varchar(128) )
	,table_name = cast( table_name as varchar(128) )
	,column_name = cast( column_name as varchar(128) )
	,ordinal_position
	,column_default = cast( column_default as varchar(max))
	,is_nullable
	,data_type = cast( data_type as varchar(128) )
	,character_maximum_length
	,character_octet_length
	,numeric_precision
	,numeric_precision_radix
	,numeric_scale
	,datetime_precision

from	[' + @server_name + '].[' + @database_name +  '].information_schema.columns
union all
select
	server_name = ''' + @server_name + '''
	,database_name = ''' + @database_name + '''
	,table_schema = cast( TABLE_SCHEMA as varchar(128) )
	,table_name = cast( table_name as varchar(128) )
	,column_name = cast( column_name as varchar(128) )
	,ordinal_position
	,column_default = cast( column_default as varchar(max))
	,is_nullable
	,data_type = cast( data_type as varchar(128) )
	,character_maximum_length
	,character_octet_length
	,numeric_precision
	,numeric_precision_radix
	,numeric_scale
	,datetime_precision
from	[' + @server_name + '].[' + @database_name +  '].information_schema.routine_columns

'
	if @test_run = 1
	begin
		print @sql_string
	end
	else
	begin
		begin try
			execute ( @sql_string )
		end try
		begin catch
			select @activity = @activity + ' against server: [' + @server_name + ']'
			goto log_error
		end catch
	end
	select @row_count = count(*), @table_name = '#_mdm_monitor_table_schema' from #_mdm_monitor_table_schema
	exec dbo.usp_util_activity_logging
					@transaction_id		= @transaction_id
					,@procedure_name	= @procedure_name
					,@table_name		= @table_name
					,@activity		= @activity
					,@dml_type		= 'I'
					,@row_count		= @row_count
					,@output_print		= @output_print




	begin try
		select @activity = 'Create unique clustered index on #_mdm_monitor_table_schema'
		create unique clustered index IX_#_mdm_monitor_table_schema
		on #_mdm_monitor_table_schema (
			server_name
			,database_name
			,table_schema
			,table_name
			,ordinal_position
			,column_name
		)
	end try
	begin catch
		goto log_error
	end catch




	if @test_run = 1 goto test_run

	/**************************************************************************************************
		DELETE_OD_DELTAS
	***************************************************************************************************/
	begin try
		select @activity = 'Delete od deltas from [' + @server_name + '].[' + @database_name + ']'
		delete	dbo.t_monitor_od_deltas
		where
			server_name = @server_name
		and	database_name = @database_name
		select @row_count = @@rowcount, @table_name = 't_monitor_od_deltas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'D'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch


	/**************************************************************************************************
		DELETE_TS_DELTAS
	***************************************************************************************************/
	begin try
		select @activity = 'Delete ts deltas from [' + @server_name + '].[' + @database_name + ']'
		delete	dbo.t_monitor_ts_deltas
		where
			server_name = @server_name
		and	database_name = @database_name
		select @row_count = @@rowcount, @table_name = 't_monitor_ts_deltas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'D'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch




	/**************************************************************************************************
		DELETE_OBJECTS
	***************************************************************************************************/
	-- select count(*) from sys.objects
	begin try
		select @activity = 'Delete objects from [' + @server_name + '].[' + @database_name + ']'
		delete	dbo.t_monitor_objects
		where
			is_ignored = 0x0
		and	server_name = @server_name
		and	database_name = @database_name
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'D'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch



	/**************************************************************************************************
		INSERT_OBJECTS
	***************************************************************************************************/
	begin try
		select @activity = 'Insert objects into [' + @server_name + '].[' + @database_name + ']'
		insert into dbo.t_monitor_objects(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
		)
		select
			OBJ.server_name
			,OBJ.database_name
			,OBJ.[schema_name]
			,OBJ.[object_name]
			,OBJ.type_desc

			-- select *
		from	#_mdm_objects as OBJ
		where	not exists (
				select	*
				from	dbo.t_monitor_objects as sub
				where	sub.server_name		= OBJ.server_name
				and	sub.database_name	= OBJ.database_name
				and	sub.[schema_name]	= OBJ.[schema_name]
				and	sub.[object_name]	= OBJ.[object_name]
				and	sub.type_desc		= OBJ.type_desc
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_objects'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'I'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch







	/**************************************************************************************************
		DELETE_OBJECT_MISSING_DEFINITIONS
	***************************************************************************************************/
	begin try
		-- 
		-- select * from dbo.t_monitor_od_deltas
		-- 
		select @activity = 'Delete missing definitions from [' + @server_name + '].[' + @database_name + ']'
		delete	OBD
		from	dbo.t_monitor_object_definitions as OBD
		where
			OBD.server_name = @server_name
		and	OBD.database_name = @database_name
		and	not exists (
				select	*
				from	#_mdm_object_definitions as OJD
				where	
					OJD.server_name		= OBD.server_name
				and	OJD.database_name	= OBD.database_name
				and	OJD.[schema_name]	= OBD.[schema_name]
				and	OJD.[object_name]	= OBD.[object_name]
				and	OJD.type_desc		= OBD.type_desc
				and	OJD.colid		= OBD.colid
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_object_definitions'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'D'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch






	/**************************************************************************************************
		UPDATE_OBJECT_DEFINITION_TEXT_DELTAS
	***************************************************************************************************/
	begin try
		-- 
		-- select * from dbo.t_monitor_od_deltas
		-- 
		select @activity = 'Update definition deltas in [' + @server_name + '].[' + @database_name + ']'
		update	OBD
		set	OBD.[text] = OJD.[text]
			,OBD.transaction_id = @transaction_id
			,OBD.batch_date = current_timestamp

			-- select *
		from	#_mdm_object_definitions			as OJD
		inner join	dbo.t_monitor_object_definitions	as OBD
		on	
			OBD.server_name		= OJD.server_name
		and	OBD.database_name	= OJD.database_name
		and	OBD.[schema_name]	= OJD.[schema_name]
		and	OBD.[object_name]	= OJD.[object_name]
		and	OBD.type_desc		= OJD.type_desc
		and	OBD.colid		= OJD.colid
		and	OBD.[text]		<> OJD.[text]
		select @row_count = @@rowcount, @table_name = 't_monitor_object_definitions'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'U'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch





	/**************************************************************************************************
		INSERT_NEW_OBJECT_DEFINITIONS
	***************************************************************************************************/
	begin try
		-- select * from dbo.t_monitor_object_definitions where 
		select @activity = 'Insert object definitions into [' + @server_name + '].[' + @database_name + ']'
		insert into dbo.t_monitor_object_definitions(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
		)
		select
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id = @transaction_id
			-- select *
		from	#_mdm_object_definitions as dub
		where	not exists (
				select	*
				from	dbo.t_monitor_object_definitions as sub
				where	sub.server_name		= dub.server_name
				and	sub.database_name	= dub.database_name
				and	sub.[schema_name]	= dub.[schema_name]
				and	sub.[object_name]	= dub.[object_name]
				and	sub.type_desc		= dub.type_desc
				and	sub.colid		= dub.colid
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_object_definitions'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'I'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch







	/**************************************************************************************************
		DELETE_MISSING_TABLE_SKHEMAS
	***************************************************************************************************/
	-- select count(*) from sys.objects
	begin try
		select @activity = 'Delete missing schemas from [' + @server_name + '].[' + @database_name + ']'

		-- declare @system_date datetime, @cr_lf char(2); select @system_date = getdate(),@cr_lf = char(13) + char(10)
		delete	MTS
		from	dbo.t_monitor_table_schemas as MTS
		where
			MTS.server_name = @server_name
		and	MTS.database_name = @database_name
		and	not exists (
				select	*
				from	#_mdm_monitor_table_schema as sub
				where
					sub.server_name		= MTS.server_name
				and	sub.database_name	= MTS.database_name
				and	sub.table_schema	= MTS.table_schema
				and	sub.table_name		= MTS.table_name
				and	sub.ordinal_position	= MTS.ordinal_position
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_table_schemas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'D'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch





	/**************************************************************************************************
		UPDATE_CHANGED_TABLE_SKHEMAS
	***************************************************************************************************/
	-- select count(*) from sys.objects
	begin try
		select @activity = 'Update changed schemas in [' + @server_name + '].[' + @database_name + ']'

		-- declare @system_date datetime, @cr_lf char(2); select @system_date = getdate(),@cr_lf = char(13) + char(10)
		update	MTS
		set	MTS.column_name			= TSM.column_name
			,MTS.column_default		= TSM.column_default
			,MTS.is_nullable		= TSM.is_nullable
			,MTS.data_type			= TSM.data_type
			,MTS.character_maximum_length	= TSM.character_maximum_length
			,MTS.character_octet_length	= TSM.character_octet_length
			,MTS.numeric_precision		= TSM.numeric_precision
			,MTS.numeric_precision_radix	= TSM.numeric_precision_radix
			,MTS.numeric_scale		= TSM.numeric_scale
			,MTS.datetime_precision		= TSM.datetime_precision
			,MTS.transaction_id		= @transaction_id
			,MTS.batch_date			= current_timestamp

		from	#_mdm_monitor_table_schema		as TSM
		inner join	dbo.t_monitor_table_schemas	as MTS
		on	MTS.server_name		= TSM.server_name
		and	MTS.database_name	= TSM.database_name
		and	MTS.table_schema	= TSM.table_schema
		and	MTS.table_name		= TSM.table_name
		and	MTS.ordinal_position	= TSM.ordinal_position
		and	not (
					MTS.column_name		= TSM.column_name
				and	MTS.is_nullable		= TSM.is_nullable
				and	MTS.data_type		= TSM.data_type

				and ( MTS.column_default is null AND TSM.column_default is null
					OR MTS.column_default = TSM.column_default
				)
				and ( MTS.character_maximum_length is null AND TSM.character_maximum_length is null
					OR MTS.character_maximum_length = TSM.character_maximum_length
				)
				and ( MTS.character_octet_length is null AND TSM.character_octet_length is null
					OR MTS.character_octet_length = TSM.character_octet_length
				)
				and ( MTS.numeric_precision is null AND TSM.numeric_precision is null
					OR MTS.numeric_precision = TSM.numeric_precision
				)
				and ( MTS.numeric_precision_radix is null AND TSM.numeric_precision_radix is null
					OR MTS.numeric_precision_radix = TSM.numeric_precision_radix
				)
				and ( MTS.numeric_scale is null AND TSM.numeric_scale is null
					OR MTS.numeric_scale = TSM.numeric_scale
				)
				and ( MTS.datetime_precision is null AND TSM.datetime_precision is null
					OR MTS.datetime_precision = TSM.datetime_precision
				)
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_table_schemas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'U'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch




	/**************************************************************************************************
		INSERT_NEW_TABLE_SKHEMAS
	***************************************************************************************************/
	begin try
		-- select top 10 * from t_monitor_table_schemas
		select @activity = 'Insert table schema into [' + @server_name + '].[' + @database_name + ']'
		insert into dbo.t_monitor_table_schemas(
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
		)
		select
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id = @transaction_id

			-- select *
		from	#_mdm_monitor_table_schema as TSM
		where	not exists (
				select	*
				from	dbo.t_monitor_table_schemas as TAS
				where	TAS.server_name		= TSM.server_name
				and	TAS.database_name	= TSM.database_name
				and	TAS.table_schema	= TSM.table_schema
				and	TAS.table_name		= TSM.table_name
				and	TAS.ordinal_position	= TSM.ordinal_position
			)
		select @row_count = @@rowcount, @table_name = 't_monitor_table_schemas'
		exec dbo.usp_util_activity_logging
						@transaction_id		= @transaction_id
						,@procedure_name	= @procedure_name
						,@table_name		= @table_name
						,@activity		= @activity
						,@dml_type		= 'I'
						,@row_count		= @row_count
						,@output_print		= @output_print
	end try
	begin catch
		goto log_error
	end catch





test_run:
	/**************************************************************************************************
		THE_END
	***************************************************************************************************/
	set @activity = 'END________' + upper( @procedure_name )
	exec dbo.usp_util_activity_logging
					@transaction_id = @transaction_id
					,@procedure_name = @procedure_name
					,@activity = @activity
					,@output_print = @output_print


	return @@error

	/**************************************************************************************************
		LOG_THE_ERROR_RAISE_THE_ERROR_AND_RETURN
	***************************************************************************************************/
log_error:
	select @activity = 'Error: ' + @activity

	exec dbo.usp_util_activity_logging
				@transaction_id		= @transaction_id
				,@procedure_name	= @procedure_name
				,@activity		= @activity
				,@error_number		= @error_number output
				,@error_severity	= @error_severity output
				,@error_state		= @error_state output
				,@error_message		= @error_message output
				,@output_print		= @output_print

	select @error_message = @activity + '::' + @error_message

	raiserror ( @error_message, @error_severity, @error_state ) with nowait
	return @error_number


end -- [usp_monitor_db_merge]
GO



























USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[TR_T_MONITOR_TABLE_SCHEMAS_INSERT]
on [dbo].[t_monitor_table_schemas]
for insert
/***************************************************************************************************************************************************

Purpose:	Row level auditing of table schemas


Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	declare @activity varchar(255)
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(4000)


	begin transaction monitor_audits

	begin try
		select @activity = 'Insert into t_monitor_table_schemas_audit'

		insert into dbo.t_monitor_table_schemas_audit(
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
			,create_date
			,batch_date
			,audit_type = 'I'

		from	inserted
	end try
	begin catch
		goto error_handling
	end catch



	commit transaction monitor_audits


	goto skip_to_me_loo

error_handling:

	select 
		@error_number		= ERROR_NUMBER()
		,@error_severity	= ERROR_SEVERITY()
		,@error_state		= coalesce( nullif( ERROR_STATE(), 0 ), 1 )
		,@error_message		= @activity + ' failure; ' + ERROR_MESSAGE()


	print '@error_number = ' + cast( @error_number as varchar )
	print '@error_severity = ' + cast( @error_severity as varchar )
	print '@error_state = ' + cast( @error_state as varchar )
	print '@error_message = ' + @error_message

	rollback transaction monitor_audits

	raiserror ( @error_message, @error_severity, @error_state ) with nowait


skip_to_me_loo:

end -- [TR_T_MONITOR_TABLE_SCHEMAS_INSERT]
GO


USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[TR_T_MONITOR_TABLE_SCHEMAS_UPDATE]
on [dbo].[t_monitor_table_schemas]
for update
/***************************************************************************************************************************************************

Purpose:	Row level auditing of table schemas


Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	declare @activity varchar(255)
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(4000)

	declare @batch_date datetime


	select @batch_date = current_timestamp



	begin transaction monitor_audits

	begin try
		select @activity = 'Insert before audits'

		insert into dbo.t_monitor_table_schemas_audit(
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			D.server_name
			,D.database_name
			,D.table_schema
			,D.table_name
			,D.column_name
			,D.ordinal_position
			,D.column_default
			,D.is_nullable
			,D.data_type
			,D.character_maximum_length
			,D.character_octet_length
			,D.numeric_precision
			,D.numeric_precision_radix
			,D.numeric_scale
			,D.datetime_precision
			,D.transaction_id
			,D.create_date
			,D.batch_date
			,audit_type = 'B'

		from	deleted as D
	end try
	begin catch
		goto error_handling
	end catch


	begin try
		select @activity = 'Insert after audits'

		insert into dbo.t_monitor_table_schemas_audit(
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			I.server_name
			,I.database_name
			,I.table_schema
			,I.table_name
			,I.column_name
			,I.ordinal_position
			,I.column_default
			,I.is_nullable
			,I.data_type
			,I.character_maximum_length
			,I.character_octet_length
			,I.numeric_precision
			,I.numeric_precision_radix
			,I.numeric_scale
			,I.datetime_precision
			,I.transaction_id
			,I.create_date
			,batch_date = @batch_date
			,audit_type = 'A'

		from	inserted as I
	end try
	begin catch
		goto error_handling
	end catch



	commit transaction monitor_audits


	goto skip_to_me_loo

error_handling:

	select 
		@error_number		= ERROR_NUMBER()
		,@error_severity	= ERROR_SEVERITY()
		,@error_state		= coalesce( nullif( ERROR_STATE(), 0 ), 1 )
		,@error_message		= @activity + ' failure; ' + ERROR_MESSAGE()


	print '@error_number = ' + cast( @error_number as varchar )
	print '@error_severity = ' + cast( @error_severity as varchar )
	print '@error_state = ' + cast( @error_state as varchar )
	print '@error_message = ' + @error_message

	rollback transaction monitor_audits

	raiserror ( @error_message, @error_severity, @error_state ) with nowait


skip_to_me_loo:

end -- [TR_T_MONITOR_TABLE_SCHEMAS_UPDATE]
GO



USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[TR_T_MONITOR_TABLE_SCHEMAS_DELETE]
on [dbo].[t_monitor_table_schemas]
for delete
/***************************************************************************************************************************************************

Purpose:	Row level auditing of table schemas


Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	declare @activity varchar(255)
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(4000)

	declare @batch_date datetime


	select @batch_date = current_timestamp



	begin transaction monitor_audits

	begin try
		select @activity = 'Insert delete audits'

		insert into dbo.t_monitor_table_schemas_audit(
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			server_name
			,database_name
			,table_schema
			,table_name
			,column_name
			,ordinal_position
			,column_default
			,is_nullable
			,data_type
			,character_maximum_length
			,character_octet_length
			,numeric_precision
			,numeric_precision_radix
			,numeric_scale
			,datetime_precision
			,transaction_id
			,create_date
			,batch_date
			,audit_type = 'D'

		from	deleted
	end try
	begin catch
		goto error_handling
	end catch




	commit transaction monitor_audits


	goto skip_to_me_loo

error_handling:

	select 
		@error_number		= ERROR_NUMBER()
		,@error_severity	= ERROR_SEVERITY()
		,@error_state		= coalesce( nullif( ERROR_STATE(), 0 ), 1 )
		,@error_message		= @activity + ' failure; ' + ERROR_MESSAGE()


	print '@error_number = ' + cast( @error_number as varchar )
	print '@error_severity = ' + cast( @error_severity as varchar )
	print '@error_state = ' + cast( @error_state as varchar )
	print '@error_message = ' + @error_message

	rollback transaction monitor_audits

	raiserror ( @error_message, @error_severity, @error_state ) with nowait


skip_to_me_loo:

end -- [TR_T_MONITOR_TABLE_SCHEMAS_DELETE]
GO







USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[TR_T_MONITOR_OBJECT_DEFINITIONS_INSERT]
on [dbo].[t_monitor_object_definitions]
for insert
/***************************************************************************************************************************************************

Purpose:	Row level auditing of object definitions


Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	declare @activity varchar(255)
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(4000)


	begin transaction monitor_audits

	begin try
		select @activity = 'Insert into t_monitor_object_definitions_audit'

		insert into dbo.t_monitor_object_definitions_audit(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
			,create_date
			,batch_date
			,audit_type = 'I'

		from	inserted
	end try
	begin catch
		goto error_handling
	end catch



	commit transaction monitor_audits


	goto skip_to_me_loo

error_handling:

	select 
		@error_number		= ERROR_NUMBER()
		,@error_severity	= ERROR_SEVERITY()
		,@error_state		= coalesce( nullif( ERROR_STATE(), 0 ), 1 )
		,@error_message		= @activity + ' failure; ' + ERROR_MESSAGE()


	print '@error_number = ' + cast( @error_number as varchar )
	print '@error_severity = ' + cast( @error_severity as varchar )
	print '@error_state = ' + cast( @error_state as varchar )
	print '@error_message = ' + @error_message

	rollback transaction monitor_audits

	raiserror ( @error_message, @error_severity, @error_state ) with nowait


skip_to_me_loo:

end -- [TR_T_MONITOR_OBJECT_DEFINITIONS_INSERT]
GO


USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[TR_T_MONITOR_OBJECT_DEFINITIONS_UPDATE]
on [dbo].[t_monitor_object_definitions]
for update
/***************************************************************************************************************************************************

Purpose:	Row level auditing of object definitions


Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	declare @activity varchar(255)
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(4000)

	declare @batch_date datetime

	select @batch_date = current_timestamp


	begin transaction monitor_audits

	begin try
		select @activity = 'Insert before audits'

		insert into dbo.t_monitor_object_definitions_audit(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			D.server_name
			,D.database_name
			,D.[schema_name]
			,D.[object_name]
			,D.type_desc
			,D.colid
			,D.[text]
			,D.transaction_id
			,D.create_date
			,D.batch_date
			,audit_type = 'B'

		from	deleted as D
	end try
	begin catch
		goto error_handling
	end catch


	begin try
		select @activity = 'Insert after audits'

		insert into dbo.t_monitor_object_definitions_audit(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			I.server_name
			,I.database_name
			,I.[schema_name]
			,I.[object_name]
			,I.type_desc
			,I.colid
			,I.[text]
			,I.transaction_id
			,I.create_date
			,I.batch_date
			,audit_type = 'A'

		from	inserted as I
	end try
	begin catch
		goto error_handling
	end catch

	commit transaction monitor_audits


	goto skip_to_me_loo

error_handling:

	select 
		@error_number		= ERROR_NUMBER()
		,@error_severity	= ERROR_SEVERITY()
		,@error_state		= coalesce( nullif( ERROR_STATE(), 0 ), 1 )
		,@error_message		= @activity + ' failure; ' + ERROR_MESSAGE()


	print '@error_number = ' + cast( @error_number as varchar )
	print '@error_severity = ' + cast( @error_severity as varchar )
	print '@error_state = ' + cast( @error_state as varchar )
	print '@error_message = ' + @error_message

	rollback transaction monitor_audits

	raiserror ( @error_message, @error_severity, @error_state ) with nowait


skip_to_me_loo:

end -- [TR_T_MONITOR_OBJECT_DEFINITIONS_UPDATE]
GO



USE [UTILITY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[TR_T_MONITOR_OBJECT_DEFINITIONS_DELETE]
on [dbo].[t_monitor_object_definitions]
for delete
/***************************************************************************************************************************************************

Purpose:	Row level auditing of object definitions


Modified:
    20090615  David Korb Created.

***************************************************************************************************************************************************/
/*_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_
_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_TESTING_*/
as
set nocount on
begin
	declare @activity varchar(255)
	declare @error_number int
	declare @error_severity int
	declare @error_state int
	declare @error_message nvarchar(4000)

	declare @batch_date datetime


	select @batch_date = current_timestamp



	begin transaction monitor_audits

	begin try
		select @activity = 'Insert delete audits'

		insert into dbo.t_monitor_object_definitions_audit(
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
			,create_date
			,batch_date
			,audit_type
		)
		select
			server_name
			,database_name
			,[schema_name]
			,[object_name]
			,type_desc
			,colid
			,[text]
			,transaction_id
			,create_date
			,batch_date
			,audit_type = 'D'

		from	deleted
	end try
	begin catch
		goto error_handling
	end catch




	commit transaction monitor_audits


	goto skip_to_me_loo

error_handling:

	select 
		@error_number		= ERROR_NUMBER()
		,@error_severity	= ERROR_SEVERITY()
		,@error_state		= coalesce( nullif( ERROR_STATE(), 0 ), 1 )
		,@error_message		= @activity + ' failure; ' + ERROR_MESSAGE()


	print '@error_number = ' + cast( @error_number as varchar )
	print '@error_severity = ' + cast( @error_severity as varchar )
	print '@error_state = ' + cast( @error_state as varchar )
	print '@error_message = ' + @error_message

	rollback transaction monitor_audits

	raiserror ( @error_message, @error_severity, @error_state ) with nowait


skip_to_me_loo:

end -- [TR_T_MONITOR_OBJECT_DEFINITIONS_DELETE]
GO





print char(13) + char(9) + db_name() + char(13)

Rate

3.83 (6)

You rated this post out of 5. Change rating

Share

Share

Rate

3.83 (6)

You rated this post out of 5. Change rating