203 lines
5.9 KiB
Transact-SQL
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
|
|
|
|
|