SQL Server tabel hernoemen (sp_rename)

Denk goed na over de gevolgen van het hernoemen van tabellen in een SQL Server database!

Problemen waar ik regelmatig tegen aan loop, is dat objecten (vaak primary keys) niet in de nieuwe naamconventie zijn meegenomen. Bijvoorbeeld de tabel dbo.tblIndex wordt hernoemd naar dbo.tblIndexArchive. Echter op deze tabel staat een primary key met de naam PK_tblIndex_IndexId. Vervolgens wordt de tabel dbo.tblIndex opnieuw aangemaakt en geeft het aanmaken van de primary key een foutmelding, omdat die naam al binnen de tabel dbo.tblIndexArchive is gebruikt. Onderstaand TestLab iillustreert en verduidelijkt het probleem.

/*

Datum			: 5 januari 2024
Ontwikkelaar	: Mickel Reemer

Doel van het script:
--------------------
Inzage geven in gevolgen van het hernoemen van een tabel
zonder voldoende rekening te houden met de naamconventie
van objecten (zoals indexen) binnen die tabel.
*/

-- Verwijder de testtabellen wanneer ze aanwezig zijn
DROP TABLE IF EXISTS dbo.tblIndex;
DROP TABLE IF EXISTS dbo.tblIndexArchive;

-- Maak de tabel dbo.tblIndex aan en plaats een primary key op de tabel
CREATE TABLE dbo.tblIndex (
	IndexId		INT IDENTITY (1,1),
	IndexName	NVARCHAR(100),
	Remarks		NVARCHAR(200),
	CONSTRAINT PK_tblIndex_IndexId PRIMARY KEY CLUSTERED (IndexId)
);

-- Maak een index op de tabel dbo.tblIndex aan
CREATE INDEX tblIndex_IndexName ON dbo.tblIndex (IndexName);

-- Vul de tabel dbo.tblIndex met testrecords
INSERT INTO dbo.tblIndex (
	IndexName,
	Remarks
)
VALUES	('Index 1','Remark 1'),
		('Index 2','Remark 2'),
		('Index 3','Remark 3'),
		('Index 4','Remark 4'),
		('Index 5','Remark 5'),
		('Index 6','Remark 6'),
		('Index 7','Remark 7');

-- Hernoem de tabel dbo.tblIndex naar dbo.tblIndexArchive
EXEC sp_rename 'dbo.tblIndex', 'tblIndexArchive';

-- Maak de tabel dbo.tblIndex opnieuw aan met een primary key
CREATE TABLE dbo.tblIndex (
	IndexId		INT IDENTITY (1,1),
	IndexName	NVARCHAR(100),
	Remarks		NVARCHAR(200),
	CONSTRAINT PK_tblIndex_IndexId PRIMARY KEY CLUSTERED (IndexId)
);

/*
Het opnieuw aanmaken van de tabel geeft dus een foutmelding
omdat de naam van de primary key al in de tabel dbo.tblIndexArchive
bestaat.

Mijn advies zou zijn om eerst alle objecten binnen de tabel
dbo.tblIndexArchive te wijzigen naar de juiste naamconventie
en vervolgens pas de nieuwe tabel aan te maken.
*/

Belangrijk
Vergeet de naamconventie van de statistics niet te bekijken!