Files
sql-scripts/TPDT-268 - ACP in task sequence/dba_storedProcedures/mon_Check_Open_Tran.sql
2024-03-07 16:52:14 +01:00

203 lines
5.9 KiB
Transact-SQL

USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Open_Tran]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Check_Open_Tran]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Check_Open_Tran]
@in_debug tinyint = 0,
@in_Minutes smallint = 5
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va vérifier s'il n'y a pas des transactions restées ouvertes depuis X minutes
Contexte d'utilisation
----------------------
Appelé depuis le job DR92030 - Lock controller
Parametres
----------
@in_debug : non utilisé
@in_Minutes : nombre de minutes à partir desquelles on déclenche l'alerte
Creation : 28.10.16 / FLA
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @programSQL varchar (255),
@cmdAlert varchar (255),
@maxToleranceTime int,
@name varchar (255),
@result_sp int,
@spid sql_variant,
@message varchar (8000),
@subject varchar (8000),
@machine varchar (100),
@cmd varchar (8000)
/*------------ Affectation des parametres aux variables ------------*/
select @maxToleranceTime = @in_Minutes, /* minutes */
@programSQL = '%Microsoft SQL Server Management Studio - Query%',
@cmdAlert = '%AWAITING COMMAND%'
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* ON PARCOURT TOUTES LES BASES */
CREATE TABLE #Open_transaction (
OPTR_key varchar(25),
OPTR_value sql_variant
)
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
WHERE state = 0
open c_databases
FETCH NEXT FROM c_databases
into @name
while @@fetch_status <> -1
begin
if @@fetch_status <> -2
begin
select @cmd = 'DBCC OPENTRAN ([' + @name + ']) WITH TABLERESULTS, NO_INFOMSGS'
INSERT INTO #Open_transaction
EXEC (@cmd)
end /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_databases
into @name
end /* while @@fetch_status <> -1 */
close c_databases
deallocate c_databases
/* Retrieve SPID. */
declare c_transactions cursor local forward_only static for
select optr_value
from #open_transaction
where optr_key like '%spid%'
open c_transactions
FETCH NEXT FROM c_transactions
into @spid
while @@fetch_status <> -1
begin
if @@fetch_status <> -2
begin
select @message = null
select @machine = '[' + ltrim(rtrim(p.hostname)) + ']',
@subject = 'Commit/rollback qui a été oublié ?',
@message = 'Commit/rollback qui a été oublié ?
La session ['
+ convert (varchar (10), p.spid)
+ '], lancée depuis le programme ['
+ ltrim(rtrim(p.program_name))
+ '] a une transaction ouverte depuis au moins ['
+ convert (varchar (10), datediff (mi, p.last_batch, getdate ()))
+ '] minutes, à partir du poste ['
+ ltrim(rtrim(p.hostname))
+ '] en tant qu''utilisateur ['
+ ltrim(rtrim(p.loginame))
+ '] sur la base ['
+ ltrim(rtrim(db.name))
+ '].
La connection est dans l''état ['
+ ltrim(rtrim(p.cmd))
+ '].
Faire un commit/rollback dès que possible, pour éviter que d''autres sessions SQL se retrouvent bloquées (si ce n''est pas déjà le cas).'
from master..sysprocesses p with (nolock)
left join master..sysdatabases db with (nolock)
on db.dbid = p.dbid
left join master..sysusers usr with (nolock)
on usr.uid = p.uid
left join master..sysprocesses p2 with (nolock)
on p2.spid = p.blocked
left join master..sysdatabases db2 with (nolock)
on db2.dbid = p2.dbid
left join master..sysusers usr2 with (nolock)
on usr2.uid = p2.uid
where convert (varchar, p.spid) = @spid
and p.program_name like @programSQL
and datediff (mi, p.last_batch, getdate ()) >= @maxToleranceTime
and p.cmd like @cmdAlert
if @message is not null
begin
declare @sendTo varchar (8000)
select @sendTo = 'DBA_operator;' + isnull (@machine, '')
exec aps_Send_Mail_with_template
@in_param_subject = @subject,
@in_param_varchar_2 = @sendTo,
@in_param_varchar_3 = @message,
@in_param_priority = 'HIGH',
@in_job_type = 0 /* 0 = pas de template */
end
end /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_transactions
into @spid
end /* while @@fetch_status <> -1 */
close c_transactions
deallocate c_transactions
drop table #Open_transaction
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO