Update sql-struktur.sql
Errorlog hinzugefügt und den fälschlicherweise verloren geganngen code für das löschen und so weiter wiederhinzugefügt
This commit is contained in:
349
sql-struktur.sql
349
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'
|
-- Wechsel zur Datenbank 'engomo'
|
||||||
USE engomo;
|
USE engomo;
|
||||||
|
|
||||||
-- Deklariere alle benötigten Variablen und Tabellen zu Beginn
|
|
||||||
|
|
||||||
-- Deklariere eine Variable für das Tabellenpräfix
|
-- Deklariere eine Variable für das Tabellenpräfix
|
||||||
DECLARE @TablePrefix NVARCHAR(128) = 'begehung_';
|
DECLARE @TablePrefix NVARCHAR(128) = 'begehung_';
|
||||||
|
|
||||||
@@ -17,11 +26,26 @@ DECLARE @ColumnsToAdd TABLE (
|
|||||||
ColumnName NVARCHAR(128)
|
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
|
-- Deklariere Variablen für die Spalten-Schleife
|
||||||
DECLARE @TargetTable NVARCHAR(128);
|
DECLARE @TargetTable NVARCHAR(128);
|
||||||
DECLARE @CurrentColumn NVARCHAR(128);
|
DECLARE @CurrentColumn NVARCHAR(128);
|
||||||
DECLARE @AddColumnSQL NVARCHAR(MAX);
|
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
|
-- Füge die gewünschten Tabellennamen-Endungen hinzu
|
||||||
INSERT INTO @TableSuffixes (Suffix) VALUES
|
INSERT INTO @TableSuffixes (Suffix) VALUES
|
||||||
('extras'),
|
('extras'),
|
||||||
@@ -33,7 +57,7 @@ INSERT INTO @TableSuffixes (Suffix) VALUES
|
|||||||
('allgemein'),
|
('allgemein'),
|
||||||
('usersettings');
|
('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
|
INSERT INTO @ColumnsToAdd (TableName, ColumnName) VALUES
|
||||||
-- begehung_extras
|
-- begehung_extras
|
||||||
(@TablePrefix + 'extras', 'engomoid'),
|
(@TablePrefix + 'extras', 'engomoid'),
|
||||||
@@ -118,67 +142,278 @@ INSERT INTO @ColumnsToAdd (TableName, ColumnName) VALUES
|
|||||||
(@TablePrefix + 'usersettings', 'user_mail'),
|
(@TablePrefix + 'usersettings', 'user_mail'),
|
||||||
(@TablePrefix + 'usersettings', 'user_theme');
|
(@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
|
DECLARE column_cursor CURSOR FOR
|
||||||
SELECT TableName, ColumnName FROM @ColumnsToAdd;
|
SELECT TableName, ColumnName FROM @ColumnsToAdd;
|
||||||
|
|
||||||
OPEN column_cursor;
|
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;
|
FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn;
|
||||||
|
END
|
||||||
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
|
|
||||||
|
|
||||||
-- Schließe und deallokiere den Spalten-Cursor
|
-- Schließe und deallokiere den Spalten-Cursor
|
||||||
CLOSE column_cursor;
|
CLOSE column_cursor;
|
||||||
DEALLOCATE 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 ===
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user