Files
sql-scripts/HCI - detect invalid objects in all db's.sql

121 lines
3.5 KiB
PL/PgSQL

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];