Added new scripts and changes
This commit is contained in:
120
HCI - detect invalid objects in all db's.sql
Normal file
120
HCI - detect invalid objects in all db's.sql
Normal file
@@ -0,0 +1,120 @@
|
||||
USE [master]
|
||||
GO
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE @db_name VARCHAR(100);
|
||||
IF OBJECT_ID('tempdb..#objects')IS NOT NULL BEGIN;
|
||||
DROP TABLE #objects;
|
||||
END;
|
||||
|
||||
DECLARE @filter_db NVARCHAR(100);
|
||||
--SET @filter_db='ProductCompendium_Test'
|
||||
SET @filter_db='Reporting_Work'
|
||||
|
||||
CREATE TABLE #objects ([object_name] varchar(100), [schema_name] varchar(50), [object_type] varchar(50));
|
||||
DECLARE @objects_error TABLE ([db_name] VARCHAR(100), [schema_name] VARCHAR(100), [object_name] varchar(100), [object_type] VARCHAR(100), [error_msg] VARCHAR(MAX), [cmd] NVARCHAR(MAX));
|
||||
DECLARE @object_name varchar(100);
|
||||
DECLARE @schema_name varchar(100);
|
||||
DECLARE @object_type varchar(100);
|
||||
DECLARE @sql NVARCHAR(MAX);
|
||||
DECLARE @output_only BIT = 0;
|
||||
|
||||
DECLARE csr_dbs CURSOR FAST_FORWARD READ_ONLY FOR
|
||||
SELECT d.name
|
||||
FROM sys.databases d
|
||||
WHERE d.name not in ('master','model','msdb','tempdb')
|
||||
AND [d].[source_database_id] IS NULL
|
||||
AND [d].[is_read_only] = 0
|
||||
AND [d].[is_in_standby] = 0
|
||||
AND COALESCE(@filter_db, d.[name]) = [d].[name]
|
||||
|
||||
OPEN csr_dbs
|
||||
|
||||
FETCH NEXT FROM csr_dbs INTO @db_name
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
--fetch objects
|
||||
SET @sql = '
|
||||
USE '+@db_name+'
|
||||
|
||||
DELETE FROM #objects;
|
||||
|
||||
INSERT INTO #objects([object_name], [schema_name], [object_type])
|
||||
SELECT
|
||||
name as [object_name]
|
||||
, SCHEMA_NAME([schema_id]) AS [schema_name]
|
||||
, [type_desc] as [object_type]
|
||||
FROM sys.[objects] o
|
||||
WHERE [type_desc] IN (
|
||||
''VIEW''
|
||||
,''SQL_TABLE_VALUED_FUNCTION''
|
||||
,''SQL_INLINE_TABLE_VALUED_FUNCTION''
|
||||
,''SQL_SCALAR_FUNCTION''
|
||||
--,''CLR_TABLE_VALUED_FUNCTION''
|
||||
--,''CLR_SCALAR_FUNCTION''
|
||||
,''SQL_STORED_PROCEDURE''
|
||||
,''SQL_TRIGGER''
|
||||
)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM [sys].[sql_expression_dependencies] d
|
||||
WHERE d.[referencing_id] = o.[object_id]
|
||||
AND [d].[is_schema_bound_reference] = 1
|
||||
);
|
||||
|
||||
'
|
||||
EXEC sp_executesql @sql, N'';
|
||||
|
||||
DECLARE csr_object CURSOR FAST_FORWARD READ_ONLY FOR
|
||||
SELECT [object_name], [schema_name], [object_type]
|
||||
FROM #objects
|
||||
|
||||
OPEN csr_object
|
||||
|
||||
FETCH NEXT FROM csr_object INTO @object_name, @schema_name, @object_type
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
BEGIN TRY
|
||||
SELECT @sql='USE '+@db_name+'; EXEC sp_refreshsqlmodule ''['+@schema_name+'].['+@object_name+']''; ';
|
||||
IF @output_only = 0
|
||||
BEGIN
|
||||
--PRINT @db_name+'.'+@schema_name+'.'+@object_name
|
||||
EXEC sp_executesql @sql, N'';
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
PRINT @sql;
|
||||
END
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
DECLARE @errorMsg VARCHAR(MAX);
|
||||
SELECT @errorMsg = error_message();
|
||||
|
||||
IF NOT @errorMsg LIKE '%is being referenced%'
|
||||
BEGIN
|
||||
|
||||
INSERT INTO @objects_error([db_name], [schema_name], [object_name], [error_msg], [object_type], [cmd])
|
||||
SELECT @db_name, @schema_name, @object_name, @errorMsg, @object_type, @sql;
|
||||
|
||||
PRINT 'issues in db "'+@db_name+'" object (type '+@object_type+')"'+@schema_name+'.'+@object_name+'": '+ERROR_MESSAGE()
|
||||
PRINT @sql
|
||||
|
||||
END
|
||||
END CATCH
|
||||
|
||||
FETCH NEXT FROM csr_object INTO @object_name, @schema_name, @object_type
|
||||
END
|
||||
|
||||
CLOSE csr_object
|
||||
DEALLOCATE csr_object
|
||||
FETCH NEXT FROM csr_dbs INTO @db_name
|
||||
END
|
||||
|
||||
CLOSE csr_dbs
|
||||
DEALLOCATE csr_dbs
|
||||
|
||||
SELECT *
|
||||
FROM @objects_error
|
||||
ORDER BY [db_name], [schema_name], [object_name];
|
||||
Reference in New Issue
Block a user