From d9b29daad7e44f7a3e58a233640274edc1bb147e Mon Sep 17 00:00:00 2001 From: admManuel Date: Sun, 20 Oct 2024 18:48:28 +0000 Subject: [PATCH] Update sql-struktur.sql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Errorlog hinzugefügt und den fälschlicherweise verloren geganngen code für das löschen und so weiter wiederhinzugefügt --- sql-struktur.sql | 349 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 292 insertions(+), 57 deletions(-) diff --git a/sql-struktur.sql b/sql-struktur.sql index e927ad8..6557ad7 100644 --- a/sql-struktur.sql +++ b/sql-struktur.sql @@ -1,8 +1,17 @@ +IF OBJECT_ID('dbo.begehung_errorlog', 'U') IS NOT NULL +BEGIN + DROP TABLE [dbo].[begehung_errorlog]; +END + +CREATE TABLE [dbo].[begehung_errorlog] ( + [ErrorID] INT IDENTITY(1,1) PRIMARY KEY, + [ErrorMessage] NVARCHAR(MAX) NOT NULL, + [ErrorTime] DATETIME NOT NULL +); + -- Wechsel zur Datenbank 'engomo' USE engomo; --- Deklariere alle benötigten Variablen und Tabellen zu Beginn - -- Deklariere eine Variable für das Tabellenpräfix DECLARE @TablePrefix NVARCHAR(128) = 'begehung_'; @@ -17,11 +26,26 @@ DECLARE @ColumnsToAdd TABLE ( ColumnName NVARCHAR(128) ); +-- Deklariere Variablen für die Tabellen-Schleife +DECLARE @CurrentSuffix NVARCHAR(128); +DECLARE @FullTableName NVARCHAR(256); +DECLARE @CreateTableColumns NVARCHAR(MAX); +DECLARE @SQL_CREATE NVARCHAR(MAX); + +-- Deklariere Variablen für die PRIMARY KEY Schleife +DECLARE @CurrentTable NVARCHAR(128); +DECLARE @PKName NVARCHAR(128); +DECLARE @AddPKSQL NVARCHAR(MAX); + -- Deklariere Variablen für die Spalten-Schleife DECLARE @TargetTable NVARCHAR(128); DECLARE @CurrentColumn NVARCHAR(128); DECLARE @AddColumnSQL NVARCHAR(MAX); +-- Deklariere Variablen für die Lösch-Schleife +DECLARE @ExistingColumnLoop NVARCHAR(128); +DECLARE @DeleteColumnSQL NVARCHAR(MAX); + -- Füge die gewünschten Tabellennamen-Endungen hinzu INSERT INTO @TableSuffixes (Suffix) VALUES ('extras'), @@ -33,7 +57,7 @@ INSERT INTO @TableSuffixes (Suffix) VALUES ('allgemein'), ('usersettings'); --- Füge die gewünschten Spalten hinzu, einschließlich begehung_stammdaten ohne engomoid +-- Füge die gewünschten Spalten hinzu INSERT INTO @ColumnsToAdd (TableName, ColumnName) VALUES -- begehung_extras (@TablePrefix + 'extras', 'engomoid'), @@ -118,67 +142,278 @@ INSERT INTO @ColumnsToAdd (TableName, ColumnName) VALUES (@TablePrefix + 'usersettings', 'user_mail'), (@TablePrefix + 'usersettings', 'user_theme'); --- Verwende eine set-basierte Methode, um durch die Spalten zu iterieren + + +/* +=== BEGIN TABLE CREATION LOOP === +*/ + +-- Deklariere und öffne einen Cursor, um durch die Tabellennamen-Endungen zu iterieren +DECLARE table_cursor CURSOR FOR + SELECT Suffix FROM @TableSuffixes; + +OPEN table_cursor; + +FETCH NEXT FROM table_cursor INTO @CurrentSuffix; + +WHILE @@FETCH_STATUS = 0 +BEGIN + BEGIN TRY + -- Erstelle den vollständigen Tabellennamen mit dem Präfix + SET @FullTableName = @TablePrefix + @CurrentSuffix; + + -- Überprüfe, ob die Tabelle bereits existiert in der Datenbank 'engomo' + IF NOT EXISTS ( + SELECT * + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_NAME = @FullTableName + AND TABLE_SCHEMA = 'dbo' + ) + BEGIN + -- Definiere das CREATE TABLE Statement basierend auf den erlaubten Spalten + SET @CreateTableColumns = ( + SELECT STRING_AGG('[' + ColumnName + '] NVARCHAR(255)', ', ') + FROM @ColumnsToAdd + WHERE TableName = @FullTableName + ); + + IF @CreateTableColumns IS NULL OR LEN(@CreateTableColumns) = 0 + BEGIN + PRINT 'Keine Spalten definiert für Tabelle ' + @FullTableName + '. Tabelle wird nicht erstellt.'; + END + ELSE + BEGIN + SET @SQL_CREATE = N'CREATE TABLE dbo.[' + @FullTableName + N'] (' + @CreateTableColumns + N');'; + + -- Führe das dynamische SQL aus + EXEC sp_executesql @SQL_CREATE; + + PRINT 'Tabelle ' + @FullTableName + ' wurde erstellt.'; + END + END + ELSE + BEGIN + PRINT 'Tabelle ' + @FullTableName + ' existiert bereits.'; + END + END TRY + BEGIN CATCH + INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) + VALUES ('Fehler beim Erstellen der Tabelle ' + @FullTableName + ': ' + ERROR_MESSAGE(), GETDATE()); + END CATCH + + -- Hole den nächsten Suffix + FETCH NEXT FROM table_cursor INTO @CurrentSuffix; +END + +-- Schließe und deallokiere den Cursor +CLOSE table_cursor; +DEALLOCATE table_cursor; + +/* +=== END TABLE CREATION LOOP === +*/ + + + +/* +=== BEGIN PRIMARY KEY ADDITION LOOP === +*/ + +-- Füge den PRIMARY KEY für jede Tabelle hinzu, die engomoid hat +DECLARE pk_cursor CURSOR FOR + SELECT DISTINCT TableName + FROM @ColumnsToAdd + WHERE ColumnName = 'engomoid'; + +OPEN pk_cursor; + +FETCH NEXT FROM pk_cursor INTO @CurrentTable; + +WHILE @@FETCH_STATUS = 0 +BEGIN + BEGIN TRY + -- Überprüfe, ob der PRIMARY KEY bereits existiert + IF NOT EXISTS ( + SELECT * + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS + WHERE TABLE_NAME = @CurrentTable + AND CONSTRAINT_TYPE = 'PRIMARY KEY' + AND TABLE_SCHEMA = 'dbo' + ) + BEGIN + -- Definiere den Constraint-Namen + SET @PKName = 'PK_' + @CurrentTable; + + -- Definiere das ALTER TABLE Statement zum Hinzufügen des PRIMARY KEY + SET @AddPKSQL = N'ALTER TABLE dbo.[' + @CurrentTable + N'] ADD CONSTRAINT [' + @PKName + N'] PRIMARY KEY (engomoid);'; + + -- Führe das dynamische SQL aus + EXEC sp_executesql @AddPKSQL; + + PRINT 'Primary Key auf engomoid in ' + @CurrentTable + ' wurde hinzugefügt.'; + END + ELSE + BEGIN + PRINT 'Primary Key auf engomoid in ' + @CurrentTable + ' existiert bereits.'; + END + END TRY + BEGIN CATCH + INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) + VALUES ('Fehler beim Hinzufügen des Primary Keys zu ' + @CurrentTable + ': ' + ERROR_MESSAGE(), GETDATE()); + END CATCH + + -- Hole den nächsten TableName + FETCH NEXT FROM pk_cursor INTO @CurrentTable; +END + +-- Schließe und deallokiere den Cursor +CLOSE pk_cursor; +DEALLOCATE pk_cursor; + +/* +=== END PRIMARY KEY ADDITION LOOP === +*/ + + + +/* +=== BEGIN COLUMN ADDITION LOOP === +*/ + +-- Deklariere und öffne einen Cursor, um durch die Spalten zu iterieren DECLARE column_cursor CURSOR FOR SELECT TableName, ColumnName FROM @ColumnsToAdd; OPEN column_cursor; -BEGIN TRY +FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn; + +WHILE @@FETCH_STATUS = 0 +BEGIN + BEGIN TRY + -- Überprüfe, ob die Spalte bereits existiert + IF NOT EXISTS ( + SELECT * + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = @TargetTable + AND COLUMN_NAME = @CurrentColumn + AND TABLE_SCHEMA = 'dbo' + ) + BEGIN + -- Definiere das ALTER TABLE Statement zum Hinzufügen der Spalte + SET @AddColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] ADD [' + @CurrentColumn + N'] NVARCHAR(255);'; + + -- Führe das dynamische SQL aus + EXEC sp_executesql @AddColumnSQL; + + PRINT 'Spalte ' + @CurrentColumn + ' wurde zu ' + @TargetTable + ' hinzugefügt.'; + END + ELSE + BEGIN + PRINT 'Spalte ' + @CurrentColumn + ' existiert bereits in ' + @TargetTable + '.'; + END + END TRY + BEGIN CATCH + INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) + VALUES ('Fehler beim Hinzufügen der Spalte ' + @CurrentColumn + ' zu ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE()); + END CATCH + + -- Hole die nächste Spalte FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn; - - WHILE @@FETCH_STATUS = 0 - BEGIN - BEGIN TRY - -- Überprüfe, ob die Tabelle existiert, andernfalls erstelle die Tabelle - IF NOT EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_NAME = @TargetTable - AND TABLE_SCHEMA = 'dbo' - ) - BEGIN - -- Erstelle die Tabelle, wenn sie nicht existiert - DECLARE @CreateTableSQL NVARCHAR(MAX); - SET @CreateTableSQL = N'CREATE TABLE dbo.[' + @TargetTable + N'] (' + @CurrentColumn + N' NVARCHAR(255));'; - EXEC sp_executesql @CreateTableSQL; - PRINT 'Tabelle ' + @TargetTable + ' wurde erstellt.'; - END - - -- Überprüfe, ob die Spalte bereits existiert - IF NOT EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_NAME = @TargetTable - AND COLUMN_NAME = @CurrentColumn - AND TABLE_SCHEMA = 'dbo' - ) - BEGIN - -- Definiere das ALTER TABLE Statement zum Hinzufügen der Spalte mit NVARCHAR(255) Typ - SET @AddColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] ADD [' + @CurrentColumn + N'] NVARCHAR(255);'; - - -- Führe das dynamische SQL aus - EXEC sp_executesql @AddColumnSQL; - - PRINT 'Spalte ' + @CurrentColumn + ' wurde zu ' + @TargetTable + ' hinzugefügt.'; - END - ELSE - BEGIN - PRINT 'Spalte ' + @CurrentColumn + ' existiert bereits in ' + @TargetTable + '.'; - END - END TRY - BEGIN CATCH - PRINT 'Fehler beim Hinzufügen der Spalte ' + @CurrentColumn + ' zu ' + @TargetTable + ': ' + ERROR_MESSAGE(); - END CATCH - - -- Hole die nächste Spalte - FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn; - END -END TRY -BEGIN CATCH - PRINT 'Fehler während der Cursor-Iteration: ' + ERROR_MESSAGE(); -END CATCH +END -- Schließe und deallokiere den Spalten-Cursor CLOSE column_cursor; DEALLOCATE column_cursor; + +/* +=== END COLUMN ADDITION LOOP === +*/ + + + +/* +=== BEGIN COLUMN DELETION LOOP === +*/ + +-- Deklariere und öffne einen Cursor, um durch die Tabellen zu iterieren +DECLARE delete_cursor CURSOR FOR + SELECT DISTINCT TableName FROM @ColumnsToAdd; + +OPEN delete_cursor; + +FETCH NEXT FROM delete_cursor INTO @TargetTable; + +WHILE @@FETCH_STATUS = 0 +BEGIN + BEGIN TRY + -- Hole alle existierenden Spalten in der Tabelle + DECLARE @ExistingColumns TABLE (ColumnName NVARCHAR(128)); + + INSERT INTO @ExistingColumns (ColumnName) + SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = @TargetTable + AND TABLE_SCHEMA = 'dbo'; + + -- Iteriere durch jede existierende Spalte + DECLARE ExistingColumnCursor CURSOR LOCAL FAST_FORWARD FOR + SELECT ColumnName FROM @ExistingColumns; + + OPEN ExistingColumnCursor; + + FETCH NEXT FROM ExistingColumnCursor INTO @ExistingColumnLoop; + + WHILE @@FETCH_STATUS = 0 + BEGIN + -- Überprüfe, ob die Spalte in den erlaubten Spalten ist + IF NOT EXISTS ( + SELECT 1 + FROM @ColumnsToAdd + WHERE TableName = @TargetTable + AND ColumnName = @ExistingColumnLoop + ) + BEGIN + BEGIN TRY + -- Definiere das ALTER TABLE Statement zum Löschen der Spalte + SET @DeleteColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] DROP COLUMN [' + @ExistingColumnLoop + N'];'; + + -- Führe das dynamische SQL aus + EXEC sp_executesql @DeleteColumnSQL; + + PRINT 'Spalte ' + @ExistingColumnLoop + ' wurde aus ' + @TargetTable + ' gelöscht.'; + END TRY + BEGIN CATCH + -- Ignoriere den Fehler und fahre fort + INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) + VALUES ('Fehler beim Löschen der Spalte ' + @ExistingColumnLoop + ' aus ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE()); + END CATCH + END + ELSE + BEGIN + PRINT 'Spalte ' + @ExistingColumnLoop + ' ist erlaubt in ' + @TargetTable + '.'; + END + + FETCH NEXT FROM ExistingColumnCursor INTO @ExistingColumnLoop; + END + + -- Schließe und deallokiere den existierenden Spalten-Cursor + CLOSE ExistingColumnCursor; + DEALLOCATE ExistingColumnCursor; + END TRY + BEGIN CATCH + INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) + VALUES ('Fehler beim Überprüfen/Löschen von Spalten in ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE()); + END CATCH + + -- Hole den nächsten TableName + FETCH NEXT FROM delete_cursor INTO @TargetTable; +END + +-- Schließe und deallokiere den Lösch-Cursor +CLOSE delete_cursor; +DEALLOCATE delete_cursor; + +/* +=== END COLUMN DELETION LOOP === +*/ \ No newline at end of file