Saltar al contenido
Categoría: Sin categorizar
2016-09-05

Generar Script de Creación de Primary Key en tablas Heap

El otro día cuando realizaba un Health Check en un servidor SQL Server de un cliente, ejecuté el típico script de tablas sin Primary Key, devolvió más de 200 tablas, el resultado era de esperar ya que es una base de datos que fue creciendo sin control ni mantenimiento.

Nunca está de mas recordar una frase que todo DBA tendría que tener escrita a fuego Todas las tablas tienen que tener una Primary Key(y un índice clustered), si no sabéis porqué, este enlace os ayudará a entenderlo mejor.

Teniendo el punto anterior claro, me puse a buscar un script que me auto generara la Primary Key y su índice clustered asociado, después de un rato buscando en Google no encontré nada, por lo que finalmente me tocó crear el script.

Aquí os lo dejo los dos scripts que realicé para que no os pase como a mí:

En mi caso me encontré con que algunas tablas ya tenían creado un campo Identity, por lo que simplemente había que generar el código de creación de la PK utilizando el campo Identity existente.

-- Generar Script de Creación de Primary Key en tablas con Identity y sin PK 
SELECT S.NAME AS Schemaname
	,O.NAME AS Tablename
	,C.NAME AS IdentityColumn
	,'ALTER TABLE ' + QUOTENAME(S.NAME) + '.' + QUOTENAME(O.NAME) + ' ADD CONSTRAINT [PK_' + O.NAME + '] PRIMARY KEY CLUSTERED ( ' + QUOTENAME(c.NAME) + ' ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]' AS CreatePKScript
FROM sys.columns C
INNER JOIN sys.objects O ON O.object_id = C.object_id
INNER JOIN sys.tables T ON T.object_id = O.object_id
INNER JOIN sys.schemas S ON S.schema_id = T.schema_id
WHERE COLUMNPROPERTY(object_id(O.NAME), C.NAME, 'IsIdentity') = 1
	AND OBJECTPROPERTY(object_id(O.NAME), 'TableHasPrimaryKey') = 0
	AND O.type = 'u'
ORDER BY O.NAME

El resto de tablas no tenían ni campo Identity ni PK, por lo que había que generar primero el código de creación del campo Identity y el código de creación de la PK utilizando el nuevo campo.

-- Generar Script de Creación de campo Identity y Primary Key en tablas sin Identity y sin PK 
SELECT DISTINCT S.NAME AS SchemaName
	,O.NAME AS TableName
	,'ALTER TABLE ' + QUOTENAME(S.NAME) + '.' + QUOTENAME(O.NAME) + ' ADD [' + O.NAME + '_PK] INT IDENTITY(1,1)' AS CreateIdentityScript
	,'ALTER TABLE ' + QUOTENAME(S.NAME) + '.' + QUOTENAME(O.NAME) + ' ADD CONSTRAINT [PK_' + O.NAME + '] PRIMARY KEY CLUSTERED ( [' + O.NAME + '_PK] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]' AS CreatePKScript
FROM sys.columns C
INNER JOIN sys.objects O ON O.object_id = C.object_id
INNER JOIN sys.tables T ON T.object_id = O.object_id
INNER JOIN sys.schemas S ON S.schema_id = T.schema_id
WHERE OBJECTPROPERTY(object_id(O.NAME), 'TableHasPrimaryKey') = 0
	AND O.type = 'u'
	AND O.NAME NOT IN (
		SELECT O.NAME
		FROM sys.columns C
		INNER JOIN sys.objects O ON O.object_id = C.object_id
		WHERE COLUMNPROPERTY(object_id(O.NAME), C.NAME, 'IsIdentity') = 1
			AND O.type = 'u'
		)
ORDER BY O.NAME

Complete este formulario para recibir la guía de Windows Server en Azure
*Obligatorio
Complete este formulario para recibir la guía de Windows Server en Azure
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir 4 best practices to implement a comprehensive Zero Trust security approach
*Obligatorio
Complete este formulario para recibir 4 best practices to implement a comprehensive Zero Trust security approach
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir Cloud Migration Essentials
*Obligatorio
Complete este formulario para recibir Cloud Migration Essentials
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir Cloud security Advice for Nonprofit Leaders
*Obligatorio
Complete este formulario para recibir Cloud security Advice for Nonprofit Leaders
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir Prevent data leaks with Microsoft 365 Business Premium
*Obligatorio
Complete este formulario para recibir Prevent data leaks with Microsoft 365 Business Premium
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete this form to recieve the guide of Windows Server on Azure
*Required
Complete this form to recieve the guide of Windows Server on Azure
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve 4 best practices to implement a comprehensive Zero Trust security approach
*Required
Complete this form to recieve 4 best practices to implement a comprehensive Zero Trust security approach
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Cloud Migration Essentials
*Required
Complete this form to recieve Cloud Migration Essentials
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Cloud security Advice for Nonprofit Leaders
*Required
Complete este formulario para recibir Cloud security Advice for Nonprofit Leaders
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Prevent data leaks with Microsoft 365 Business Premium
*Obligatorio
Complete this form to recieve Prevent data leaks with Microsoft 365 Business Premium
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Cloud Migration Simplified Ebook.
*Obligatorio
Complete this form to recieve Prevent data leaks with Microsoft 365 Business Premium
Thank you for filling out the form [name]. Here's your Free eBook!