Batch jobs: failed (001), longer than their own history (002), late or never started (003), stuck in Executing (004). Number sequences: running out with a forecast from SQLInsight's own samples (005), format shorter than HIGHEST (006), blocked but still referenced (007), continuous and not cleaned up (008). RecId running out, flagged far earlier for AX 3.0's 32-bit RecId (009). AX user behind blocking from CONTEXT_INFO, honest where AX 3.0 cannot tell (010). Subjects carry the database, so findings follow the hub opt-in. SQL Scripts/<rule>.sql (and _collectors/) for every AX rule added or changed in 1.4, incl. COM-AX-001..007: a Danish header plus the exact SQL SQLInsight sends, generated from the code and checked by SqlScriptTests (rewrite with SQLINSIGHT_UPDATE_SQL_SCRIPTS=1). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
120 lines
7.4 KiB
Transact-SQL
120 lines
7.4 KiB
Transact-SQL
/*
|
||
Delt collector-forespørgsel: Dynamics AX-genkendelsen (bruges af alle SQLI-AX- og COM-AX-regler, Servere og databaser
|
||
og Dynamics AX-siderne i SQLInsight Web)
|
||
|
||
Hvad
|
||
Finder de overvågede databaser, der er Dynamics AX: SQLDICTIONARY og DATAAREA i samme skema. Versionen afgøres af
|
||
skemaet (src/SQLInsight.Core/DynamicsAx/AxDetection.cs – Recognise):
|
||
RECID på SQLDICTIONARY er int (præcision 10) → Axapta 2.5/3.0 (typisk skema bmssa)
|
||
bigint, BATCHJOB findes ikke → AX 4.0
|
||
BATCHJOB findes, NUMBERSEQUENCESCOPE gør ikke → AX 2009
|
||
NUMBERSEQUENCESCOPE, ingen PARTITION-kolonne → AX 2012 RTM/FP
|
||
PARTITION og modeldatabasen <db>_model på instansen → AX 2012 R2/R3
|
||
PARTITION uden noget modellager → Dynamics 365 F&O on-premises (formodet)
|
||
Læser kun metadata (sys.tables, sys.columns, HAS_PERMS_BY_NAME) og – hvis agenten må – firmalisten i DATAAREA.
|
||
Resultatet gemmes i hukommelsen i en time og som snapshot "dynamics-ax" i repository'et.
|
||
|
||
Collector: src/SQLInsight.Collectors/DynamicsAx/AxDatabaseDetector.cs – AxDatabaseDetector.GetAsync (via
|
||
DynamicsAxCollector, hver time; også under Servere og databaser: src/SQLInsight.Collectors/Discovery/
|
||
DatabaseDiscovery.cs – DynamicsAxSql).
|
||
Rettigheder: Genkendelsen: kun grant-least-privilege.sql (VIEW ANY DEFINITION, CONNECT ANY DATABASE). Firmalisten:
|
||
valgfri AX-læseadgang, GRANT SELECT ON [bmssa].[DATAAREA] TO [<agentens bruger>]; (dbo efter AX 3.0).
|
||
Versioner: SQL Server 2005 og nyere; under Servere og databaser også SQL Server 2000 (sysobjects, uden rettigheds-
|
||
oplysninger). Axapta 3.0 er verificeret mod en kundes skema. AX 4.0, AX 2009, AX 2012 og F&O: baseret på
|
||
Microsofts dokumenterede skema – ikke verificeret mod kundedata.
|
||
*/
|
||
-- >>> SQL, som SQLInsight kører – genereret fra koden (tests/SQLInsight.Collectors.Tests/SqlScriptTests.cs). Ret ikke herunder i hånden.
|
||
-- Variant: Alle versioner: online brugerdatabaser og deres snapshot-indstillinger (AxDatabaseDetector.DatabasesSql)
|
||
SELECT name, snapshot_isolation_state, is_read_committed_snapshot_on
|
||
FROM sys.databases
|
||
WHERE database_id > 4 AND state = 0 AND source_database_id IS NULL AND HAS_DBACCESS(name) = 1
|
||
ORDER BY name
|
||
GO
|
||
|
||
-- Variant: Alle versioner: agentens login, til GRANT-teksten
|
||
SELECT SUSER_SNAME()
|
||
GO
|
||
|
||
-- Variant: SQL Server 2005 og nyere: AX-genkendelse i hver overvåget database (AxDetection.MetadataSql via AxSql.InDatabase)
|
||
DECLARE @Database sysname;
|
||
SET @Database = N'AXDB'; -- <== ret til databasen
|
||
DECLARE @Sql nvarchar(max);
|
||
SET @Sql = N'SET NOCOUNT ON; SET LOCK_TIMEOUT 2000; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT s.name, UPPER(t.name), UPPER(c.name), TYPE_NAME(c.system_type_id), c.precision, c.max_length,
|
||
ISNULL(HAS_PERMS_BY_NAME(QUOTENAME(s.name) + N''.'' + QUOTENAME(t.name), N''OBJECT'', N''SELECT''), 0),
|
||
(SELECT TOP 1 p.name FROM sys.database_principals p WHERE p.sid = SUSER_SID())
|
||
FROM sys.tables t
|
||
JOIN sys.schemas s ON s.schema_id = t.schema_id
|
||
JOIN sys.columns c ON c.object_id = t.object_id
|
||
WHERE UPPER(t.name) IN (N''SQLDICTIONARY'', N''DATAAREA'', N''SYSCONFIG'', N''BATCH'', N''BATCHJOB'', N''BATCHJOBHISTORY'', N''BATCHGROUP'', N''NUMBERSEQUENCETABLE'', N''NUMBERSEQUENCESCOPE'', N''NUMBERSEQUENCEREFERENCE'', N''SYSTEMSEQUENCES'', N''MODELELEMENT'')
|
||
ORDER BY s.name, t.name, c.column_id';
|
||
DECLARE @Procedure nvarchar(300);
|
||
SET @Procedure = QUOTENAME(@Database) + N'.sys.sp_executesql';
|
||
EXEC @Procedure @Sql;
|
||
SET LOCK_TIMEOUT -1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||
GO
|
||
|
||
-- Variant: SQL Server 2000 (kun opdagelse under Servere og databaser, AxDetection.MetadataSql2000)
|
||
SELECT u.name, UPPER(o.name), UPPER(c.name), TYPE_NAME(c.xtype), c.xprec, c.length, 0, NULL
|
||
FROM [AXDB].dbo.sysobjects o
|
||
JOIN [AXDB].dbo.sysusers u ON u.uid = o.uid
|
||
JOIN [AXDB].dbo.syscolumns c ON c.id = o.id
|
||
WHERE o.xtype = 'U' AND UPPER(o.name) IN (N'SQLDICTIONARY', N'DATAAREA', N'SYSCONFIG', N'BATCH', N'BATCHJOB', N'BATCHJOBHISTORY', N'BATCHGROUP', N'NUMBERSEQUENCETABLE', N'NUMBERSEQUENCESCOPE', N'NUMBERSEQUENCEREFERENCE', N'SYSTEMSEQUENCES', N'MODELELEMENT')
|
||
ORDER BY u.name, o.name, c.colid
|
||
GO
|
||
|
||
-- Variant: Axapta 3.0 (skema bmssa): firmaer (AxSchemaAdapter.Companies)
|
||
DECLARE @Database sysname;
|
||
SET @Database = N'AXDB'; -- <== ret til AX-databasen
|
||
DECLARE @Schema sysname;
|
||
SET @Schema = N'bmssa'; -- <== ejeren af AX-tabellerne: bmssa i Axapta 3.0, ellers dbo
|
||
DECLARE @Sql nvarchar(max);
|
||
SET @Sql = N'SET NOCOUNT ON; SET LOCK_TIMEOUT 2000; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT TOP (500) d.[ID], d.[NAME], d.[ISVIRTUAL] FROM [bmssa].[DATAAREA] d ORDER BY d.[ID]';
|
||
SET @Sql = REPLACE(@Sql, N'[bmssa].', QUOTENAME(@Schema) + N'.');
|
||
DECLARE @Procedure nvarchar(300);
|
||
SET @Procedure = QUOTENAME(@Database) + N'.sys.sp_executesql';
|
||
EXEC @Procedure @Sql;
|
||
SET LOCK_TIMEOUT -1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||
GO
|
||
|
||
-- Variant: AX 4.0 (skema dbo) – ikke verificeret mod kundedata: firmaer (AxSchemaAdapter.Companies)
|
||
DECLARE @Database sysname;
|
||
SET @Database = N'AXDB'; -- <== ret til AX-databasen
|
||
DECLARE @Schema sysname;
|
||
SET @Schema = N'dbo'; -- <== ejeren af AX-tabellerne: bmssa i Axapta 3.0, ellers dbo
|
||
DECLARE @Sql nvarchar(max);
|
||
SET @Sql = N'SET NOCOUNT ON; SET LOCK_TIMEOUT 2000; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT TOP (500) d.[ID], d.[NAME], d.[ISVIRTUAL] FROM [dbo].[DATAAREA] d ORDER BY d.[ID]';
|
||
SET @Sql = REPLACE(@Sql, N'[dbo].', QUOTENAME(@Schema) + N'.');
|
||
DECLARE @Procedure nvarchar(300);
|
||
SET @Procedure = QUOTENAME(@Database) + N'.sys.sp_executesql';
|
||
EXEC @Procedure @Sql;
|
||
SET LOCK_TIMEOUT -1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||
GO
|
||
|
||
-- Variant: AX 2009 – baseret på Microsofts dokumenterede skema, ikke verificeret mod kundedata: firmaer (AxSchemaAdapter.Companies)
|
||
DECLARE @Database sysname;
|
||
SET @Database = N'AXDB'; -- <== ret til AX-databasen
|
||
DECLARE @Schema sysname;
|
||
SET @Schema = N'dbo'; -- <== ejeren af AX-tabellerne: bmssa i Axapta 3.0, ellers dbo
|
||
DECLARE @Sql nvarchar(max);
|
||
SET @Sql = N'SET NOCOUNT ON; SET LOCK_TIMEOUT 2000; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT TOP (500) d.[ID], d.[NAME], d.[ISVIRTUAL] FROM [dbo].[DATAAREA] d ORDER BY d.[ID]';
|
||
SET @Sql = REPLACE(@Sql, N'[dbo].', QUOTENAME(@Schema) + N'.');
|
||
DECLARE @Procedure nvarchar(300);
|
||
SET @Procedure = QUOTENAME(@Database) + N'.sys.sp_executesql';
|
||
EXEC @Procedure @Sql;
|
||
SET LOCK_TIMEOUT -1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||
GO
|
||
|
||
-- Variant: AX 2012 RTM/R2/R3 og F&O – baseret på Microsofts dokumenterede skema, ikke verificeret mod kundedata: firmaer (AxSchemaAdapter.Companies)
|
||
DECLARE @Database sysname;
|
||
SET @Database = N'AXDB'; -- <== ret til AX-databasen
|
||
DECLARE @Schema sysname;
|
||
SET @Schema = N'dbo'; -- <== ejeren af AX-tabellerne: bmssa i Axapta 3.0, ellers dbo
|
||
DECLARE @Sql nvarchar(max);
|
||
SET @Sql = N'SET NOCOUNT ON; SET LOCK_TIMEOUT 2000; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT TOP (500) d.[ID], d.[NAME], d.[ISVIRTUAL] FROM [dbo].[DATAAREA] d ORDER BY d.[ID]';
|
||
SET @Sql = REPLACE(@Sql, N'[dbo].', QUOTENAME(@Schema) + N'.');
|
||
DECLARE @Procedure nvarchar(300);
|
||
SET @Procedure = QUOTENAME(@Database) + N'.sys.sp_executesql';
|
||
EXEC @Procedure @Sql;
|
||
SET LOCK_TIMEOUT -1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||
GO
|
||
-- <<< slut på genereret SQL
|