Bases de datos

SQL Server

Eliminación de objetos de bases de datos v2

Última actualización: 23-04-2022 19:48

El script SQL compartido en esta página es la versión #2 de algo que ya se había publicado en este enlace en Septiembre/2020.

La diferencia básicamente es que esta versión #2 elimina TODOS LOS OBJETOS de la base de datos -exceptuando la tabla y procedimientos que MSSQL pone cuando se crean diagramas de la base de datos- sin pedir confirmación alguna.

MUY IMPORTANTE
Este sitio web y el autor de esta nota no se hace responsable de los resultados obtenidos por la mala ejecución de este script.

Texto coloreado utilizando [ tohtml.com ]Descargar archivo
-- SSI base de datos en uso es distinta a "master" => Se ejecutarán los comandos de eliminación de objetos
use [master];
go

-- Inicialización de variables
declare @n int, @i int, @XSQL varchar(max), @stk varchar(max);
declare @tProtectedObject table (OBJ_NAME varchar(300));
declare @tSQL table ( ROWID int identity (1, 1) not null, GROUP_NUMBER int not null, XSQL varchar(max))

	set nocount on;
	set @stk = char(13) + replicate('*', 75) + char(13);

	-- Se muestra cantidad de objetos por tipo que existen
	select type, type_desc, COUNT(*) as CANTIDAD_ANTES from sys.objects group by type, type_desc order by 1, 2;


	-- Se ponen en tabla [@tProtectedObject] lista de objetos que no se deberán eliminar	
	insert into @tProtectedObject (OBJ_NAME)
		values ('sysdiagrams'),
				('sp_alterdiagram'),			('sp_creatediagram'),	('sp_dropdiagram'),
				('sp_helpdiagramdefinition'),	('sp_helpdiagrams'),	('sp_renamediagram'),
				('sp_upgraddiagrams'),			('fn_diagramobjects');



	-- Se ponen en table [@tSQL] los comandos para eliminar llaves foráneas, funciones, procedimientos, vistas y tablas
	insert into @tSQL (GROUP_NUMBER, XSQL)

		-- Eliminación de llaves foráneas
		select 10 as GROUP_NUMBER,
				'alter table [' + e.name + '].[' + c.name + '] drop constraint [' + b.name + '];' as XSQL
		from sys.objects a
			inner join sys.foreign_keys b on b.referenced_object_id = a.object_id
			inner join sys.objects c on c.object_id = b.parent_object_id
			inner join sys.schemas d on d.schema_id = a.schema_id
			inner join sys.schemas e on e.schema_id = c.schema_id
			left outer join @tProtectedObject po on po.OBJ_NAME = a.[name]
			left outer join @tProtectedObject po2 on po2.OBJ_NAME = c.[name]
		where po.OBJ_NAME is null and po2.OBJ_NAME is null

		union -- Eliminación de funciones, procedimientos, vistas y tablas	
		select a.GROUP_NUMBER, 'drop ' + lower(a.OBJ_TYPE) + ' [' + a.OBJ_SCHEMA + '].[' +  a.OBJ_NAME + ']' as XSQL
		from (
				-- Eliminación de funciones
				select 70 as GROUP_NUMBER, 'FUNCTION' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME
				from sys.objects a
					inner join sys.schemas b on b.[schema_id] = a.[schema_id]
					left outer join @tProtectedObject po on po.OBJ_NAME = a.[name]
				where a.type in ('fn', 'TF') and po.OBJ_NAME is null

				union -- Eliminación de procedimientos
				select 80 as GROUP_NUMBER, 'PROCEDURE' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME
				from sys.objects a
					inner join sys.schemas b on b.[schema_id] = a.[schema_id]
					left outer join @tProtectedObject po on po.OBJ_NAME = a.[name]
				where a.type in ('p') and po.OBJ_NAME is null

				union -- Elimiación de vistas
				select 90 as GROUP_NUMBER, 'VIEW' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME
				from sys.objects a
					inner join sys.schemas b on b.[schema_id] = a.[schema_id]
					left outer join @tProtectedObject po on po.OBJ_NAME = a.[name]
				where a.type in ('v') and po.OBJ_NAME is null

				union -- Eliminación de tablas
				select 100 as GROUP_NUMBER, 'TABLE' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME
				from sys.objects a
					inner join sys.schemas b on b.[schema_id] = a.[schema_id]
					left outer join @tProtectedObject po on po.OBJ_NAME = a.[name]
				where a.type in ('u') and po.OBJ_NAME is null

		) a
	order by 1, 2;


	-- Ejecución de comandos de eliminación de objetos

	if ((db_name() = 'master')) print @stk + 'No se ejecutarán los comandos por estar en la base de datos [master]' + @stk;
	begin
		set @n = (select count(*) from @tSQL);

		if (@n > 0) print @stk + 'Comandos a ejecutar' + @stk;

		set @i = 1;
		while (@i <= @n)
		begin
			set @XSQL = (select XSQL from @tSQL where ROWID = @i);
			print  @XSQL;

			if ((not db_name() = 'master')) exec (@XSQL);
			set @i += 1;
		end;
	end;

	if ((not db_name() = 'master')) print @stk + '¡¡¡Comandos ejecutados!!!' + @stk;

	-- Se muestra cantidad de objetos por tipo que han quedado
	select type, type_desc, COUNT(*) as CANTIDAD_DESPUES from sys.objects group by type, type_desc order by 1, 2;

	set nocount off;
go