Skip to content

Commit 47a1eec

Browse files
committed
Add script multi replcmd
1 parent 149e00b commit 47a1eec

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

CDC/sp_multi_replcmds.sql

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*#info
2+
3+
# Autor
4+
Rodrigo Ribeiro Gomes
5+
6+
# Detalhes
7+
Eu não lembro exatamente o porquê criei isso, mas vagas memórias me remetem a tentar ler o log de diferentes bancos em paralelo, para algum teste.
8+
Deixei o script apenas para referência, não me lembro se tem algum uso prático em ambientes de prod.
9+
10+
11+
*/
12+
ALTER PROCEDURE
13+
sp_multi_replcmds
14+
(
15+
@WaitNextTime int = null
16+
,@MaxRepeats int = 1000
17+
)
18+
AS
19+
20+
DECLARE
21+
@GlobalRID varchar(255)
22+
,@DB sysname
23+
,@RID_Using varchar(500)
24+
,@RID_isUsing bit
25+
,@Comando nvarchar(max)
26+
27+
28+
SELECT
29+
@GlobalRID = ISNULL(OBJECT_NAME(ST.objectid,ST.dbid),'')
30+
FROM
31+
sys.dm_exec_requests R
32+
CROSS APPLY
33+
sys.dm_exec_sql_text(R.sql_handle) ST
34+
WHERE
35+
R.session_id = @@SPID
36+
37+
SET @RID_Using = '-- #REUSING: THIS RESOURCE IS USING FOR: '+@GlobalRID
38+
39+
DECLARE @RID_GetR varchar(100)
40+
SET @RID_GetR = @GlobalRID +':BANCO_EXEC';
41+
42+
GET_RESOURCE:
43+
SET @Comando = NULL
44+
SET @DB = NULL
45+
EXEC sp_getapplock @RID_GetR,'EXCLUSIVE','SESSION';
46+
47+
SELECT
48+
@DB = name
49+
FROM
50+
(
51+
SELECT TOP 1
52+
D.name
53+
FROM
54+
sys.databases D
55+
WHERE
56+
D.is_cdc_enabled = 1
57+
AND
58+
D.database_id NOT IN (
59+
60+
SELECT
61+
R.database_id
62+
FROM
63+
sys.dm_exec_requests R
64+
CROSS APPLY
65+
sys.dm_exec_sql_text(R.sql_handle) ST
66+
WHERE
67+
OBJECT_NAME(ST.objectid,ST.dbid) = 'sp_replcmds'
68+
)
69+
) T
70+
71+
IF @DB IS NOT NULL
72+
BEGIN
73+
74+
SET @Comando = 'EXEC '+QUOTENAME(@DB)+'..sp_replcmds; exec sp_repldone null,null,1,0,1';
75+
print @comando;
76+
77+
-- Tentando obter o lock para a base específica...
78+
DECLARE @RID_ExecR varchar(100)
79+
SET @RID_ExecR = @GlobalRID+':DB:'+@DB
80+
81+
BEGIN TRY
82+
EXEC sp_getapplock @RID_ExecR,'EXCLUSIVE','SESSION',@LockTimeout = 500;
83+
SET @RID_isUsing = 1;
84+
END TRY
85+
BEGIN CATCH
86+
SET @RID_isUsing = 0;
87+
88+
IF ERROR_NUMBER() = 1222
89+
BEGIN
90+
GOTO GET_RESOURCE;
91+
END ELSE BEGIN
92+
93+
EXEC sp_releaseapplock @RID_GetR,'SESSION';
94+
print ERROR_NUMBER()
95+
print ERROR_MESSAGE()
96+
RAISERROR('Houve um erro.',16,1);
97+
98+
END
99+
END CATCH
100+
101+
END
102+
103+
EXEC sp_releaseapplock @RID_GetR,'SESSION';
104+
105+
106+
IF @Comando IS NULL
107+
RAISERROR('Não há comando para executar: %d',16,1,@@SPID);
108+
ELSE
109+
EXEC(@Comando)
110+
;
111+
112+
EXEC sp_releaseapplock @RID_ExecR,'SESSION'
113+

0 commit comments

Comments
 (0)