--GetDBUserPolicies
USE msdb
SELECT
p.[name] AS [PolicyName]
,CASE
WHEN pc.[name] IS NOT NULL THEN pc.[name]
ELSE N'<Default>'
END AS [PolicyCategory]
,p.[description] AS [Description]
,c.[name] AS [Condition]
,CAST(LEFT(c.facet, 4000) AS NVARCHAR(4000)) AS [Facet]
,p.help_link AS [HelpLink]
--,p.help_text AS [HelpText]
,p.is_enabled AS [IsEnabled]
--,cf.obj_name AS [ObjectName]
,CAST(CASE WHEN pc.[name] LIKE '%error%' THEN 1 ELSE 0 END AS BIT) AS IsErrorPolicy
FROM syspolicy_policies p
JOIN syspolicy_conditions c ON c.condition_id = p.condition_id
JOIN syspolicy_object_sets os ON os.object_set_id = p.object_set_id
JOIN syspolicy_target_sets ts ON ts.object_set_id = os.object_set_id
JOIN syspolicy_target_set_levels tsl ON tsl.target_set_id = ts.target_set_id
JOIN syspolicy_policy_categories pc ON pc.policy_category_id = p.policy_category_id
--LEFT OUTER JOIN syspolicy_conditions cf ON cf.condition_id = tsl.condition_id
WHERE c.facet = 'Database' AND p.is_system = 0;
USE master
SELECT
[name] AS [DatabaseName]
FROM sys.databases d
WHERE source_database_id IS NULL AND
NOT ([name] IN ('master','model','msdb','tempdb') OR is_distributor = 1);
--AgentJobDiscovery
SELECT sjv.job_id,
sjv.name,
sjv.originating_server,
sjv.description,
category = ISNULL(sc.name, FORMATMESSAGE(14205)),
owner = msdb.dbo.SQLAGENT_SUSER_SNAME(sjv.owner_sid),
sjv.enabled
FROM msdb.dbo.sysjobs_view sjv
JOIN msdb.dbo.syscategories sc ON sjv.category_id = sc.category_id
where <<#JOB_FILTER#>>
ORDER BY sjv.job_id;
--DatabaseList
DECLARE @xml xml = @excludeList
;WITH excludeList
AS
(
SELECT T.db.value('(./@name)[1]', 'nvarchar(max)') AS dbName
FROM @xml.nodes('ExcludeList/Database') AS T(db)
)
SELECT
d.[name] AS [DatabaseName]
,d.collation_name AS [Collation]
,d.recovery_model_desc AS [RecoveryModel]
,DATABASEPROPERTYEX(d.NAME, 'Updateability') AS [Updateability]
,d.user_access_desc UserAccess
,(SELECT (CASE WHEN MAX(mf.growth) > 0 THEN 1 ELSE 0 END) FROM sys.master_files mf WHERE d.database_id = mf.database_id AND mf.type = 1) as LogAutogrow
,(SELECT (CASE WHEN MAX(mf.growth) > 0 THEN 1 ELSE 0 END) FROM sys.master_files mf WHERE d.database_id = mf.database_id AND mf.type = 0) as DatabaseAutogrow
,SUSER_SNAME(d.owner_sid) as OwnerName
FROM sys.databases d
LEFT JOIN excludeList el
ON (el.dbName NOT LIKE '%*%' AND DB_ID(el.dbName) = d.database_id)
OR d.[name] LIKE REPLACE(REPLACE(REPLACE(REPLACE(el.dbName, '%', '[%]'), '[', '[[]'), '_', '[_]'), '*', '%')
WHERE d.source_database_id IS NULL
AND el.dbName IS NULL
--AgentDiscovery
SELECT
servicename AS [AgentName]
,service_account AS [AccountName]
FROM sys.dm_server_services
WHERE [filename] LIKE '"%\Binn\SQLAGENT.EXE" -i%'
--DBEngineDiscovery
SET NOCOUNT ON;
SELECT
SERVERPROPERTY('MachineName') AS [MachineName],
ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS [InstanceName],
SERVERPROPERTY('Edition') AS [Edition],
SERVERPROPERTY('ProductVersion') AS [Version],
CASE WHEN ISNULL(SERVERPROPERTY('IsClustered'), 0) > 0 THEN 'True' ELSE 'False' END AS [IsClustered],
(SELECT msglangid FROM sys.syslanguages WHERE [langid] = @@LANGID) AS [Language],
@@MICROSOFTVERSION / 0x01000000 AS [ProductMajorVersion],
DEFAULT_DOMAIN()[NetBIOSDomainName]
--GetResourcePoolsCD
DECLARE @dbName SYSNAME, @defaultResourcePoolName NVARCHAR(128) = NULL, @sql NVARCHAR(2000), @errorStatusCheck INT, @allowedRoConnection BIT, @requiredRwConnection BIT, @readWriteDbCount INT = 0;
/*
Predefined pools:
1 - Internal pool - cannot be used for Hekaton
2 - Default pool
*/
IF @isReadOnlyMode = 1
BEGIN
WITH dbrp_cte AS(
SELECT DISTINCT
resource_pool_id
FROM sys.databases
)
SELECT
rp.[name] AS [Name]
,pool_id AS PoolId
,min_cpu_percent AS MinCpuPercent
,max_cpu_percent AS MaxCpuPercent
,cap_cpu_percent AS CapCpupercent
,min_memory_percent AS MinMemoryPercent
,max_memory_percent AS MaxMemoryPercent
,CAST(CASE
WHEN pool_id = 1 THEN 0
WHEN pool_id = 2 THEN 1
WHEN dbrp_cte.resource_pool_id IS NOT NULL THEN 1
ELSE 0
END AS BIT) AS [ManagesInMemoryOLTP]
FROM master.sys.dm_resource_governor_resource_pools rp
LEFT JOIN dbrp_cte ON dbrp_cte.resource_pool_id = rp.pool_id
END;
SELECT TOP 1 @defaultResourcePoolName = [name] FROM master.sys.dm_resource_governor_resource_pools WHERE pool_id = 2
IF @defaultResourcePoolName IS NOT NULL
BEGIN
IF OBJECT_ID ('tempdb.dbo.#ResultTable') IS NOT NULL DROP TABLE #ResultTable;
CREATE TABLE #ResultTable (
[DatabaseName] SYSNAME
,[ResourcePoolName] NVARCHAR(128)
,[AccessStatus] INT
,[ErrorNumber] INT
,[ErrorMessage] NVARCHAR(MAX)
);
IF OBJECT_ID ('tempdb.dbo.#ReadWriteDbs') IS NOT NULL DROP TABLE #ReadWriteDbs;
CREATE TABLE #ReadWriteDbs(
[DatabaseName] SYSNAME
);
IF @isReadOnlyMode = 1
BEGIN
INSERT INTO #ResultTable
SELECT
dbs.[name]
,rp.[name]
,1
,0
,NULL
FROM master.sys.databases dbs
INNER JOIN master.sys.dm_resource_governor_resource_pools rp on dbs.resource_pool_id = rp.pool_id
WHERE dbs.source_database_id IS NULL
AND dbs.is_distributor = 0
AND dbs.[name] NOT IN ('master', 'msdb', 'model', 'tempdb');
DECLARE dbCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
d.name,
CASE
WHEN [role] IS NULL OR ([role] = 1 AND primary_role_allow_connections = 2) OR ([role] = 2 AND secondary_role_allow_connections > 1) THEN 1
ELSE 0
END AS allowedRoConnection,
CASE
WHEN ([role] = 1 AND primary_role_allow_connections = 3) THEN 1
ELSE 0
END AS requiredRwConnection
FROM sys.databases d
LEFT JOIN sys.dm_hadr_availability_replica_states dhars ON d.replica_id = dhars.replica_id
LEFT JOIN sys.availability_replicas ar ON d.replica_id = ar.replica_id
WHERE d.source_database_id IS NULL
AND d.resource_pool_id IS NULL
AND d.is_distributor = 0
AND d.[name] NOT IN ('master', 'msdb', 'model', 'tempdb');
END
ELSE
BEGIN
DECLARE @xmlDoc XML = cast(@readWriteDbs AS XML)
DECLARE dbCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
xc.value('./n[1]', 'sysname') AS DatabaseName,
0 AS allowedRoConnection,
1 AS requiredRwConnection
FROM @xmlDoc.nodes('/*/d') AS xt(xc)
END;
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @dbName, @allowedRoConnection, @requiredRwConnection;
WHILE @@Fetch_Status = 0 BEGIN
IF @isReadOnlyMode = 1 AND @requiredRwConnection = 0 AND @allowedRoConnection = 0 BEGIN
INSERT INTO #ResultTable([DatabaseName],[AccessStatus],[ErrorNumber]) VALUES (@dbName, 0, -50001)
END
ELSE IF @isReadOnlyMode = 1 AND @requiredRwConnection = 1
BEGIN
SET @readWriteDbCount = @readWriteDbCount + 1;
INSERT INTO #ReadWriteDbs(DatabaseName) VALUES(@dbName);
END
ELSE BEGIN
SET @sql = N'USE '+ QUOTENAME(@dbName ,'"') + N';
SELECT TOP 1
DB_NAME() AS [DatabaseName]
,@defaultResourcePoolName AS [ResourcePoolName]
,1 AS [AccessStatus]
,0 as [ErrorNumber]
,NULL as [ErrorMessage]
FROM sys.filegroups fg
--JOIN sys.database_files f ON f.data_space_id = fg.data_space_id
WHERE fg.[type] COLLATE DATABASE_DEFAULT = ''FX'';';
BEGIN TRY
INSERT INTO #ResultTable
EXEC sp_executesql @sql, N'@defaultResourcePoolName NVARCHAR(128)', @defaultResourcePoolName = @defaultResourcePoolName
END TRY
BEGIN CATCH
SET @errorStatusCheck = HAS_DBACCESS(@dbName);
INSERT INTO #ResultTable
SELECT
@dbName AS [DatabaseName]
,@defaultResourcePoolName AS [ResourcePoolName]
,@errorStatusCheck AS [AccessStatus]
,ERROR_NUMBER() as [ErrorNumber]
,ERROR_MESSAGE() as [ErrorMessage];
END CATCH;
END; --ELSE END
FETCH NEXT FROM dbCursor INTO @dbName, @allowedRoConnection, @requiredRwConnection;
END;
CLOSE dbCursor;
DEALLOCATE dbCursor;
SELECT * FROM #ResultTable;
IF @isReadOnlyMode = 1
BEGIN
SELECT @readWriteDbCount AS ReadWriteDbCount;
IF @readWriteDbCount > 0
SELECT CONVERT(NVARCHAR(MAX),(SELECT DatabaseName AS n
FROM #ReadWriteDbs
FOR XML PATH('d'), ROOT('dbNames'))) AS ReadWriteDbs;
END;
DROP TABLE #ResultTable;
DROP TABLE #ReadWriteDbs;
END;
--GetDBFileGroupsCD
--declare @isReadOnlyMode BIT, @readWriteDbs nvarchar(max);
DECLARE @dbName sysname, @sql nvarchar(2000), @errorStatusCheck INT, @allowedRoConnection BIT, @requiredRwConnection BIT, @readWriteDbCount INT = 0;
IF OBJECT_ID ('tempdb.dbo.#ResultTable') IS NOT NULL DROP TABLE #ResultTable;
CREATE TABLE #ResultTable (
[DatabaseName] SYSNAME
,[Status] INT
,[Error] INT
,[ErrorMessage] NVARCHAR(MAX)
,[GroupName] SYSNAME
,[ReadOnly] BIT
,[GroupType] NVARCHAR(2)
,[TypeDesc] NVARCHAR(60)
);
IF OBJECT_ID ('tempdb.dbo.#ReadWriteDbs') IS NOT NULL DROP TABLE #ReadWriteDbs;
CREATE TABLE #ReadWriteDbs(
[DatabaseName] SYSNAME
);
IF @isReadOnlyMode = 1
BEGIN
DECLARE dbCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
d.name,
CASE
WHEN [role] IS NULL OR ([role] = 1 AND primary_role_allow_connections = 2) OR ([role] = 2 AND secondary_role_allow_connections > 1) THEN 1
ELSE 0
END AS allowedRoConnection,
CASE
WHEN ([role] = 1 AND primary_role_allow_connections = 3) THEN 1
ELSE 0
END AS requiredRwConnection
FROM sys.databases d
LEFT JOIN sys.dm_hadr_availability_replica_states dhars ON d.replica_id = dhars.replica_id
LEFT JOIN sys.availability_replicas ar ON d.replica_id = ar.replica_id
WHERE d.source_database_id IS NULL;
END
ELSE
BEGIN
DECLARE @xmlDoc XML = cast(@readWriteDbs AS XML)
DECLARE dbCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
xc.value('./n[1]', 'sysname') AS DatabaseName,
0 AS allowedRoConnection,
1 AS requiredRwConnection
FROM @xmlDoc.nodes('/*/d') AS xt(xc)
END;
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @dbName, @allowedRoConnection, @requiredRwConnection;
WHILE @@Fetch_Status = 0
BEGIN
IF @isReadOnlyMode = 1 AND @requiredRwConnection = 0 AND @allowedRoConnection = 0 BEGIN
INSERT INTO #ResultTable([DatabaseName],[Status],[Error],[GroupName]) VALUES (@dbName, 0, -50001, N'')
END
ELSE IF @isReadOnlyMode = 1 AND @requiredRwConnection = 1
BEGIN
SET @readWriteDbCount = @readWriteDbCount + 1;
INSERT INTO #ReadWriteDbs(DatabaseName) VALUES(@dbName);
END
ELSE BEGIN
SET @sql = N'USE '+ QUOTENAME(@dbName ,'"') + N';
SELECT
DB_NAME() AS [DatabaseName]
,1 as Status
,0 as [Error]
,N'''' as [ErrorMessage]
,fg.[name] AS [GroupName]
,fg.is_read_only AS [ReadOnly]
,fg.[type] AS [GroupType]
,fg.type_desc AS [TypeDesc]
FROM sys.filegroups fg;';
BEGIN TRY
INSERT INTO #ResultTable
EXEC sp_executesql @sql
END TRY
BEGIN CATCH
SET @errorStatusCheck = HAS_DBACCESS(@dbName);
INSERT INTO #ResultTable
SELECT
@dbName AS [DatabaseName]
,CASE
WHEN @errorStatusCheck IS NULL THEN 0
ELSE @errorStatusCheck
END AS [Status]
,ERROR_NUMBER() as [Error]
,ERROR_MESSAGE() as [ErrorMessage]
,N'' AS [GroupName]
,0 AS [ReadOnly]
,N'' AS [GroupType]
,N'' AS [TypeDesc];
END CATCH;
END; --ELSE END
FETCH NEXT FROM dbCursor INTO @dbName, @allowedRoConnection, @requiredRwConnection;
END
CLOSE dbCursor;
DEALLOCATE dbCursor;
SELECT * FROM #ResultTable;
IF @isReadOnlyMode = 1
BEGIN
SELECT @readWriteDbCount AS ReadWriteDbCount;
IF @readWriteDbCount > 0
SELECT CONVERT(NVARCHAR(MAX),(SELECT DatabaseName AS n
FROM #ReadWriteDbs
FOR XML PATH('d'), ROOT('dbNames'))) AS ReadWriteDbs;
END;
DROP TABLE #ResultTable;
DROP TABLE #ReadWriteDbs;
--GetDBFilesCD
--declare @isReadOnlyMode BIT, @readWriteDbs nvarchar(max);
DECLARE @dbName sysname, @sql nvarchar(2000), @errorStatusCheck INT, @allowedRoConnection BIT, @requiredRwConnection BIT, @readWriteDbCount INT = 0;
IF OBJECT_ID ('tempdb.dbo.#ResultTable') IS NOT NULL DROP TABLE #ResultTable;
CREATE TABLE #ResultTable (
[DatabaseName] SYSNAME
,[Status] INT
,[Error] INT
,[ErrorMessage] NVARCHAR(max)
,[FileName] SYSNAME
,[FilePath] NVARCHAR(260)
,[FileGroupName] NVARCHAR(128)
,[FileType] NVARCHAR(10)
);
IF OBJECT_ID ('tempdb.dbo.#ReadWriteDbs') IS NOT NULL DROP TABLE #ReadWriteDbs;
CREATE TABLE #ReadWriteDbs(
[DatabaseName] SYSNAME
);
IF @isReadOnlyMode = 1
BEGIN
DECLARE dbCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
d.name,
CASE
WHEN [role] IS NULL OR ([role] = 1 AND primary_role_allow_connections = 2) OR ([role] = 2 AND secondary_role_allow_connections > 1) THEN 1
ELSE 0
END AS allowedRoConnection,
CASE
WHEN ([role] = 1 AND primary_role_allow_connections = 3) THEN 1
ELSE 0
END AS requiredRwConnection
FROM sys.databases d
LEFT JOIN sys.dm_hadr_availability_replica_states dhars ON d.replica_id = dhars.replica_id
LEFT JOIN sys.availability_replicas ar ON d.replica_id = ar.replica_id
WHERE d.source_database_id IS NULL;
END
ELSE
BEGIN
DECLARE @xmlDoc XML = cast(@readWriteDbs AS XML)
DECLARE dbCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
xc.value('./n[1]', 'sysname') AS DatabaseName,
0 AS allowedRoConnection,
1 AS requiredRwConnection
FROM @xmlDoc.nodes('/*/d') AS xt(xc)
END;
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @dbName, @allowedRoConnection, @requiredRwConnection;
WHILE @@Fetch_Status = 0
BEGIN
IF @isReadOnlyMode = 1 AND @requiredRwConnection = 0 AND @allowedRoConnection = 0 BEGIN
INSERT INTO #ResultTable([DatabaseName],[Status],[Error],[FileName]) VALUES (@dbName, 0, -50001, N'')
END
ELSE IF @isReadOnlyMode = 1 AND @requiredRwConnection = 1
BEGIN
SET @readWriteDbCount = @readWriteDbCount + 1;
INSERT INTO #ReadWriteDbs(DatabaseName) VALUES(@dbName);
END
ELSE BEGIN
SET @sql = N'USE '+ QUOTENAME(@dbName ,'"') + N';
SELECT
DB_NAME() AS [DatabaseName]
,DB_ID() as Status
,0 as [Error]
,N'''' as [ErrorMessage]
,f.[name] AS [FileName]
,f.physical_name AS [FilePath]
,fg.[name] as [FileGroupName]
,CASE f.[type]
WHEN 0 THEN N''DBFile''
WHEN 1 THEN N''LogFile''
WHEN 2 THEN N''Container''
END AS FileType
FROM sys.master_files f
LEFT JOIN sys.filegroups fg ON f.data_space_id = fg.data_space_id
WHERE f.database_id = DB_ID() AND (fg.[type] IS NULL OR fg.[type] COLLATE DATABASE_DEFAULT IN (N''FG'', N''FX''));';
BEGIN TRY
INSERT INTO #ResultTable
EXEC sp_executesql @sql;
END TRY
BEGIN CATCH
SET @errorStatusCheck = HAS_DBACCESS(@dbName);
INSERT INTO #ResultTable
SELECT
@dbName as [DatabaseName]
,CASE
WHEN @errorStatusCheck IS NULL THEN 0
ELSE @errorStatusCheck
END AS [Status]
,ERROR_NUMBER() AS [Error]
,ERROR_MESSAGE() AS [ErrorMessage]
,N'' AS [FileName]
,N'' AS [FilePath]
,N'' AS [FileGroupName]
,N'' AS [FileType];
END CATCH;
END; --ELSE END
FETCH NEXT FROM dbCursor INTO @dbName, @allowedRoConnection, @requiredRwConnection;
END;
CLOSE dbCursor;
DEALLOCATE dbCursor;
SELECT * FROM #ResultTable;
IF @isReadOnlyMode = 1
BEGIN
SELECT @readWriteDbCount AS ReadWriteDbCount;
IF @readWriteDbCount > 0
SELECT CONVERT(NVARCHAR(MAX),(SELECT DatabaseName AS n
FROM #ReadWriteDbs
FOR XML PATH('d'), ROOT('dbNames'))) AS ReadWriteDbs;
END;
DROP TABLE #ResultTable;
DROP TABLE #ReadWriteDbs;
--AlwaysOnSeedDiscovery
SELECT SERVERPROPERTY('IsHadrEnabled') AS [IsHadrEnabled]