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

 

Política de Privacidad

Última actualización: 23 de diciembre de 2024

 X 

Tu privacidad es importante para nosotros. En esta política de privacidad, explicamos qué información recopilamos cuando visitas nuestro sitio web y cómo utilizamos esa información.

1. Información que recopilamos

Este sitio no recopila información personal de los usuarios, excepto cuando un usuario elige voluntariamente comunicarse a través del formulario de contacto. En ese caso, los datos proporcionados (como tu nombre y correo electrónico) se utilizarán únicamente para responder a tu consulta.

2. Uso de Cookies

Este sitio web utiliza una única cookie esencial llamada PHPSESSID.

No usamos cookies de análisis ni de seguimiento.

3. Seguridad de los datos

Adoptamos medidas técnicas y organizativas razonables para proteger cualquier información que compartas con nosotros contra el acceso no autorizado, pérdida o alteración.

4. Enlaces a sitios de terceros

Nuestro sitio web puede contener enlaces a otros sitios web. No somos responsables de las prácticas de privacidad ni del contenido de dichos sitios.

5. Cambios en esta política de privacidad

Nos reservamos el derecho de actualizar esta política de privacidad en cualquier momento. Cualquier cambio será publicado en esta misma página e incluirá la fecha de la última actualización.

6. Contacto

Si tienes preguntas o inquietudes sobre esta política de privacidad, puedes comunicarte con nosotros a través de la página de contacto disponible en este sitio web.

7. Cumplimiento con Normativas Internacionales de Privacidad

Nuestro sitio web cumple con las principales regulaciones internacionales de protección de datos personales para garantizar la privacidad y seguridad de los usuarios. Esto incluye, pero no se limita a, las siguientes leyes:

Si tienes preguntas o dudas sobre el cumplimiento de estas leyes, no dudes en ponerte en contacto conmigo a través de la página de contacto de este sitio web.