About the DLM Dashboard server objects
Published 02 July 2015
DLM Dashboard server objects
When you set up a server for monitoring, you run a setup script to add the following objects to your server:
| Object | Type | What it does |
|---|---|---|
RG_SQLLighthouse_DDLTriggerRedGate | DDL trigger | Detects all schema changes. For more information on DDL triggers, see Understanding DDL Triggers. |
| RedGate | Database | Stores details of schema changes detected by the DDL trigger. |
RG_SQLLighthouse_WriteEvents RG_SQLLighthouse_ReadEvent RG_SQLLighthouse_WriteError | Stored procedures | Writes details of schema changes to the RedGate database. Extracts details of schema changes from the RedGate database. Logs any errors encountered when executing the DDL trigger. |
Note that the RedGate database may exist already if you have other Redgate products installed. The trigger is created to EXECUTE AS 'sa'.
Location of stored procedures
The default location for the stored procedures was changed in DLM Dashboard 1.7.0 from the master database to the Redgate database. For more information, see Moving stored procedures from master.
How DLM Dashboard works
When the schema of a monitored database changes:
- The DDL trigger detects the change.
- RG_SQLLighthouse_WriteEvents adds details of the changes to the RedGate database, which is regularly polled by the DLM Dashboard Monitoring Service.
- The monitoring service detects these changes and compares schema snapshots within the DLM Dashboard Storage Service, and records the differences.
- Differences are shown on the Review page in DLM Dashboard.
Running the setup script
The setup script below applies to DLM Dashboard 1.7.0 and later.
If you're using an earlier version of DLM Dashboard, or if you're changing the configuration of a server set up for monitoring in an earlier version, use the link available in DLM Dashboard when you add or edit the server. This will give you the appropriate setup script, login script and permissions information for your server configuration. See Add servers and database
To create the DLM Dashboard server objects, run this SQL script (download here) on each server you want to monitor:
Installation script
/*
* Red Gate
*
*
* _____ _ __ __ _____ _ _ _
* | __ \ | | | \/ | | __ \ | | | | | |
* | | | || | | \ / | | | | | __ _ ___ | |__ | |__ ___ __ _ _ __ __| |
* | | | || | | |\/| | | | | | / _` |/ __|| '_ \ | '_ \ / _ \ / _` || '__|/ _` |
* | |__| || |____ | | | | | |__| || (_| |\__ \| | | || |_) || (_) || (_| || | | (_| |
* |_____/ |______||_| |_| |_____/ \__,_||___/|_| |_||_.__/ \___/ \__,_||_| \__,_|
*
*
*
*
* For information about these objects, see: http://www.red-gate.com/dlm-dashboard/ddl-trigger
*
* If you have any problems, or need to change these objects, we really want to know,
* please email us at: dlmdashboardsupport@red-gate.com
*
* Copyright © Red Gate Software Ltd. 2016 | Version 1.12 | 2016-02-29
*/
USE master;
GO
/* Make sure RedGate database exists, and writes to it don't block transactions in Snapshot isolation level */
IF DB_ID(N'RedGate') IS NULL
CREATE DATABASE RedGate
ALTER DATABASE RedGate SET RECOVERY SIMPLE
ALTER DATABASE RedGate SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE RedGate SET READ_COMMITTED_SNAPSHOT ON
GO
/* Create/update objects necessary for the DLM Dashboard change detection trigger in a transaction */
BEGIN TRANSACTION RG_SQLLighthouse_CreateTrigger
IF EXISTS (SELECT 1 FROM sys.server_triggers WHERE name = 'RG_SQLLighthouse_DDLTrigger')
DROP TRIGGER RG_SQLLighthouse_DDLTrigger ON ALL SERVER
GO
USE RedGate;
GO
IF OBJECT_ID(N'dbo.RG_SQLLighthouse_WriteEvent', N'P') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_WriteEvent;
GO
IF OBJECT_ID(N'dbo.RG_SQLLighthouse_WriteError', N'P') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_WriteError;
GO
IF OBJECT_ID(N'dbo.RG_SQLLighthouse_ReadEvents', N'P') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_ReadEvents;
GO
/* Ensure SQLLighthouse schema exists */
IF OBJECT_ID(N'SQLLighthouse.DDL_Events', N'U') IS NOT NULL
DROP TABLE SQLLighthouse.DDL_Events
GO
IF OBJECT_ID(N'SQLLighthouse.Trigger_Errors', N'U') IS NOT NULL
DROP TABLE SQLLighthouse.Trigger_Errors
GO
IF SCHEMA_ID(N'SQLLighthouse') IS NOT NULL
DROP SCHEMA SQLLighthouse
GO
CREATE SCHEMA SQLLighthouse AUTHORIZATION dbo
GO
CREATE TABLE SQLLighthouse.DDL_Events (
id bigint NOT NULL IDENTITY (1,1) PRIMARY KEY,
PostTime datetimeoffset,
transaction_id bigint, spid smallint, options integer, nestlevel int, langid smallint, client_net_address varchar(48), appname nvarchar(128),
eventdata XML
)
GO
CREATE TABLE SQLLighthouse.Trigger_Errors (
id BIGINT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
error_time DATETIMEOFFSET,
error_number INT,
error_severity INT,
error_state INT,
error_procedure sysname,
error_line INT,
error_message NVARCHAR(4000),
)
GO
/*
* Red Gate
*
*
* _____ _ __ __ _____ _ _ _
* | __ \ | | | \/ | | __ \ | | | | | |
* | | | || | | \ / | | | | | __ _ ___ | |__ | |__ ___ __ _ _ __ __| |
* | | | || | | |\/| | | | | | / _` |/ __|| '_ \ | '_ \ / _ \ / _` || '__|/ _` |
* | |__| || |____ | | | | | |__| || (_| |\__ \| | | || |_) || (_) || (_| || | | (_| |
* |_____/ |______||_| |_| |_____/ \__,_||___/|_| |_||_.__/ \___/ \__,_||_| \__,_|
*
*
*
*
* For information about these objects, see: http://www.red-gate.com/dlm-dashboard/ddl-trigger
*
* If you have any problems, or need to change these objects, we really want to know,
* please email us at: dlmdashboardsupport@red-gate.com
*
* Copyright © Red Gate Software Ltd. 2016 | Version 1.12 | 2016-02-29
*/
/************************************************************************************************************
* Stored procedure: RedGate.dbo.RG_SQLLighthouse_WriteEvent
* Used by trigger RG_SQLLighthouse_DDLTrigger to write change events to RedGate.SQLLighthouse.DDL_Events
************************************************************************************************************/
CREATE PROCEDURE dbo.RG_SQLLighthouse_WriteEvent
@eventdata XML
AS
INSERT INTO RedGate.SQLLighthouse.DDL_Events
VALUES (
TODATETIMEOFFSET(CONVERT(varchar(23), @eventdata.query('data(/EVENT_INSTANCE/PostTime)')), DATEPART(tz, SYSDATETIMEOFFSET())),
(SELECT transaction_id from sys.dm_tran_current_transaction), @@SPID, @@OPTIONS, @@NESTLEVEL, @@LANGID, CONVERT(varchar(48), CONNECTIONPROPERTY('client_net_address')), APP_NAME(),
@eventdata
)
IF (SELECT COUNT(*) FROM RedGate.SQLLighthouse.DDL_Events) >= 512
BEGIN
DELETE FROM RedGate.SQLLighthouse.DDL_Events WHERE id <= SCOPE_IDENTITY() - 420
END
GO
/*
* Red Gate
*
*
* _____ _ __ __ _____ _ _ _
* | __ \ | | | \/ | | __ \ | | | | | |
* | | | || | | \ / | | | | | __ _ ___ | |__ | |__ ___ __ _ _ __ __| |
* | | | || | | |\/| | | | | | / _` |/ __|| '_ \ | '_ \ / _ \ / _` || '__|/ _` |
* | |__| || |____ | | | | | |__| || (_| |\__ \| | | || |_) || (_) || (_| || | | (_| |
* |_____/ |______||_| |_| |_____/ \__,_||___/|_| |_||_.__/ \___/ \__,_||_| \__,_|
*
*
*
*
* For information about these objects, see: http://www.red-gate.com/dlm-dashboard/ddl-trigger
*
* If you have any problems, or need to change these objects, we really want to know,
* please email us at: dlmdashboardsupport@red-gate.com
*
* Copyright © Red Gate Software Ltd. 2016 | Version 1.12 | 2016-02-29
*/
/*****************************************************************************************************************
* Stored procedure: RedGate.dbo.RG_SQLLighthouse_ReadEvents
* Used by the DLM Dashboard change detection service to read change events from RedGate.SQLLighthouse.DDL_Events
*****************************************************************************************************************/
CREATE PROCEDURE dbo.RG_SQLLighthouse_ReadEvents
AS
SELECT * FROM RedGate.SQLLighthouse.DDL_Events
GO
/*
* Red Gate
*
*
* _____ _ __ __ _____ _ _ _
* | __ \ | | | \/ | | __ \ | | | | | |
* | | | || | | \ / | | | | | __ _ ___ | |__ | |__ ___ __ _ _ __ __| |
* | | | || | | |\/| | | | | | / _` |/ __|| '_ \ | '_ \ / _ \ / _` || '__|/ _` |
* | |__| || |____ | | | | | |__| || (_| |\__ \| | | || |_) || (_) || (_| || | | (_| |
* |_____/ |______||_| |_| |_____/ \__,_||___/|_| |_||_.__/ \___/ \__,_||_| \__,_|
*
*
*
*
* For information about these objects, see: http://www.red-gate.com/dlm-dashboard/ddl-trigger
*
* If you have any problems, or need to change these objects, we really want to know,
* please email us at: dlmdashboardsupport@red-gate.com
*
* Copyright © Red Gate Software Ltd. 2016 | Version 1.12 | 2016-02-29
*/
/************************************************************************************************************
* Stored procedure: RedGate.dbo.RG_SQLLighthouse_WriteError
* Used by trigger RG_SQLLighthouse_DDLTrigger to write error logs to RedGate.SQLLighthouse.Trigger_Errors
************************************************************************************************************/
CREATE PROCEDURE dbo.RG_SQLLighthouse_WriteError
@error_number INT,
@error_severity INT,
@error_state INT,
@error_procedure sysname,
@error_line INT,
@error_message NVARCHAR(4000)
AS
INSERT INTO RedGate.SQLLighthouse.Trigger_Errors
VALUES (
SYSDATETIMEOFFSET(), @error_number, @error_severity, @error_state, @error_procedure, @error_line, @error_message
)
IF (SELECT COUNT(*) FROM RedGate.SQLLighthouse.Trigger_Errors) >= 512
BEGIN
DELETE FROM RedGate.SQLLighthouse.Trigger_Errors WHERE id <= SCOPE_IDENTITY() - 420
END
GO
USE master;
GO
/*
* Red Gate
*
*
* _____ _ __ __ _____ _ _ _
* | __ \ | | | \/ | | __ \ | | | | | |
* | | | || | | \ / | | | | | __ _ ___ | |__ | |__ ___ __ _ _ __ __| |
* | | | || | | |\/| | | | | | / _` |/ __|| '_ \ | '_ \ / _ \ / _` || '__|/ _` |
* | |__| || |____ | | | | | |__| || (_| |\__ \| | | || |_) || (_) || (_| || | | (_| |
* |_____/ |______||_| |_| |_____/ \__,_||___/|_| |_||_.__/ \___/ \__,_||_| \__,_|
*
*
*
*
* For information about these objects, see: http://www.red-gate.com/dlm-dashboard/ddl-trigger
*
* If you have any problems, or need to change these objects, we really want to know,
* please email us at: dlmdashboardsupport@red-gate.com
*
* Copyright © Red Gate Software Ltd. 2016 | Version 1.12 | 2016-02-29
*/
/*****************************************************************************************************************
* Server level trigger: RG_SQLLighthouse_DDLTrigger
* Detects DDL events and writes them to the table (via RedGate.dbo.RG_SQLLighthouse_WriteEvent)
*****************************************************************************************************************/
CREATE TRIGGER RG_SQLLighthouse_DDLTrigger
ON ALL SERVER
WITH EXECUTE AS 'sa'
AFTER DDL_EVENTS
AS
IF OBJECT_ID(N'RedGate.dbo.RG_SQLLighthouse_WriteEvent', N'P') IS NOT NULL
BEGIN
-- see http://msdn.microsoft.com/en-us/library/ms190763.aspx
DECLARE @restoreXACT_ABORT bit = 16384 & (SELECT @@OPTIONS);
SET XACT_ABORT OFF
DECLARE @restoreANSI_PADDING bit = 16 & (SELECT @@OPTIONS);
SET ANSI_PADDING ON
DECLARE @restoreANSI_WARNINGS bit = 8 & (SELECT @@OPTIONS);
SET ANSI_WARNINGS ON
DECLARE @restoreCONCAT_NULL_YIELDS_NULL bit = 4096 & (SELECT @@OPTIONS);
SET CONCAT_NULL_YIELDS_NULL ON
DECLARE @restoreNUMERIC_ROUNDABORT bit = 8192 & (SELECT @@OPTIONS);
SET NUMERIC_ROUNDABORT OFF
DECLARE @restoreNOCOUNT bit = 512 & (SELECT @@OPTIONS);
SET NOCOUNT ON
BEGIN TRY
DECLARE @eventdata XML = EVENTDATA();
EXECUTE RedGate.dbo.RG_SQLLighthouse_WriteEvent @eventdata
END TRY
BEGIN CATCH
IF OBJECT_ID(N'RedGate.dbo.RG_SQLLighthouse_WriteError', N'P') IS NOT NULL
BEGIN
BEGIN TRY
DECLARE @error_number INT = ERROR_NUMBER(),
@error_severity INT = ERROR_SEVERITY(),
@error_state INT = ERROR_STATE(),
@error_procedure SYSNAME = ERROR_PROCEDURE(),
@error_line INT = ERROR_LINE(),
@error_message NVARCHAR(4000) = ERROR_MESSAGE();
EXECUTE RedGate.dbo.RG_SQLLighthouse_WriteError @error_number,
@error_severity, @error_state, @error_procedure,
@error_line, @error_message;
END TRY
BEGIN CATCH
-- Left intentionally blank :(
END CATCH
END
END CATCH
IF @restoreXACT_ABORT = 1
BEGIN
SET XACT_ABORT ON
END
IF @restoreANSI_PADDING = 0
BEGIN
SET ANSI_PADDING OFF
END
IF @restoreANSI_WARNINGS = 0
BEGIN
SET ANSI_WARNINGS OFF
END
IF @restoreCONCAT_NULL_YIELDS_NULL = 0
BEGIN
SET CONCAT_NULL_YIELDS_NULL OFF
END
IF @restoreNUMERIC_ROUNDABORT = 1
BEGIN
SET NUMERIC_ROUNDABORT ON
END
IF @restoreNOCOUNT = 0
BEGIN
SET NOCOUNT OFF
END
END
GO
/***************************************************************************
* Cleanup obsolete objects (from previous versions of DLM Dashboard)
***************************************************************************/
IF OBJECT_ID(N'tempdb.dbo.RG_SQLLighthouse_v1', N'U') IS NOT NULL
DROP TABLE tempdb.dbo.RG_SQLLighthouse_v1
IF OBJECT_ID(N'tempdb.dbo.RG_SQLLighthouse_Errors_v1', N'U') IS NOT NULL
DROP TABLE tempdb.dbo.RG_SQLLighthouse_Errors_v1
IF OBJECT_ID(N'master.dbo.RG_SQLLighthouse_Sproc', N'P') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_Sproc
IF OBJECT_ID(N'master.dbo.RG_SQLLighthouse_WriteEvent') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_WriteEvent
IF OBJECT_ID(N'master.dbo.RG_SQLLighthouse_ReadEvents') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_ReadEvents
IF OBJECT_ID(N'master.dbo.RG_SQLLighthouse_WriteError') IS NOT NULL
DROP PROCEDURE dbo.RG_SQLLighthouse_WriteError
COMMIT TRANSACTION RG_SQLLighthouse_CreateTrigger
Removing the DLM Dashboard objects from SQL Server
To uninstall the DLM Dashboard objects from your SQL Server, run this uninstall script. The uninstall script does not delete the RedGate database - you'll need to delete it manually.