commit 370445dce8e5fa47ce766dbebc4acc17e01b88da Author: admManuel Date: Sat Oct 19 12:56:16 2024 +0000 Add sql-struktur.sql diff --git a/sql-struktur.sql b/sql-struktur.sql new file mode 100644 index 0000000..25042b9 --- /dev/null +++ b/sql-struktur.sql @@ -0,0 +1,376 @@ +-- Wechsel zur Datenbank 'engomo' +USE engomo; + +-- Deklariere eine Tabellenvariable mit den Endungen der Tabellennamen +DECLARE @TableSuffixes TABLE ( + Suffix NVARCHAR(128) +); + +-- Füge die gewünschten Tabellennamen-Endungen hinzu +INSERT INTO @TableSuffixes (Suffix) VALUES + ('extras'), + ('raeume'), + ('badewanne'), + ('toilette'), + ('dusche'), + ('waschbecken'), + ('allgemein'), + ('stammdaten'); -- Neue Tabelle ohne engomoid + +-- Deklariere eine Tabellenvariable mit den Spalteninformationen +DECLARE @ColumnsToAdd TABLE ( + TableName NVARCHAR(128), + ColumnName NVARCHAR(128), + ColumnType NVARCHAR(128) +); + +-- Füge die gewünschten Spalten hinzu, einschließlich begehung_stammdaten ohne engomoid +INSERT INTO @ColumnsToAdd (TableName, ColumnName, ColumnType) VALUES + -- begehung_extras + ('begehung_extras', 'engomoid', 'BIGINT NOT NULL'), + ('begehung_extras', 'raum_bezeichnung', 'VARCHAR(255)'), + ('begehung_extras', 'handtuchheizkoerper', 'BIT'), + ('begehung_extras', 'badetuchhalter', 'BIT'), + ('begehung_extras', 'waschmaschinenanschluss', 'BIT'), + ('begehung_extras', 'notizen', 'TEXT'), + + -- begehung_raeume + ('begehung_raeume', 'engomoid', 'BIGINT NOT NULL'), + ('begehung_raeume', 'raumid', 'VARCHAR(255)'), + ('begehung_raeume', 'raum_bezeichnung', 'VARCHAR(255)'), + ('begehung_raeume', 'tapezieren', 'BIT'), + ('begehung_raeume', 'anstrich_tuerblatt', 'BIT'), + ('begehung_raeume', 'anstrich_tuerrahmen', 'BIT'), + ('begehung_raeume', 'anstrich_tuerblatt_notizen', 'TEXT'), + ('begehung_raeume', 'anstrich_heizkoerper', 'BIT'), + ('begehung_raeume', 'anstrich_heizkoerper_notizen', 'TEXT'), + ('begehung_raeume', 'anstrich_decke', 'BIT'), + ('begehung_raeume', 'anstrich_decke_notizen', 'TEXT'), + ('begehung_raeume', 'anstrich_waende', 'BIT'), + ('begehung_raeume', 'anstrich_waende_notizen', 'TEXT'), + ('begehung_raeume', 'anstrich_fenster', 'BIT'), + ('begehung_raeume', 'anstrich_fenster_notizen', 'TEXT'), + ('begehung_raeume', 'anstrich_fenstersims', 'BIT'), + ('begehung_raeume', 'anstrich_fenstersims_notizen', 'TEXT'), + ('begehung_raeume', 'material_fenster', 'VARCHAR(255)'), + ('begehung_raeume', 'material_fenstersims', 'VARCHAR(255)'), + ('begehung_raeume', 'material_bodenbelag', 'VARCHAR(255)'), + ('begehung_raeume', 'sonstiges_einbauschrank', 'BIT'), + ('begehung_raeume', 'sonstiges_einbauschrank_notizen', 'TEXT'), + ('begehung_raeume', 'sonstiges_luefter', 'BIT'), + ('begehung_raeume', 'sonstiges_luefter_notizen', 'TEXT'), + ('begehung_raeume', 'notizen_verursachung_mieter', 'TEXT'), + ('begehung_raeume', 'notizen_instandsetzung_mieter', 'TEXT'), + ('begehung_raeume', 'notizen_instandsetzung_vermieter', 'TEXT'), + + -- begehung_badewanne + ('begehung_badewanne', 'engomoid', 'BIGINT NOT NULL'), + ('begehung_badewanne', 'raum_bezeichnung', 'VARCHAR(255)'), + ('begehung_badewanne', 'ablauf_mit_stoepsel', 'BIT'), + ('begehung_badewanne', 'excenter_garnitur', 'BIT'), + ('begehung_badewanne', 'griff', 'BIT'), + ('begehung_badewanne', 'handbrause_mit_schlauch', 'BIT'), + + -- begehung_dusche + ('begehung_dusche', 'engomoid', 'BIGINT NOT NULL'), + ('begehung_dusche', 'raum_bezeichnung', 'VARCHAR(255)'), + ('begehung_dusche', 'ablagekorb', 'BIT'), + ('begehung_dusche', 'duschabtrennung', 'BIT'), + ('begehung_dusche', 'duschkabine', 'BIT'), + ('begehung_dusche', 'duschstange', 'BIT'), + ('begehung_dusche', 'duschstange_mit_seifenschale', 'BIT'), + ('begehung_dusche', 'dusche_bodengleich', 'BIT'), + ('begehung_dusche', 'duschtasse', 'BIT'), + ('begehung_dusche', 'handbrause_mit_schlauch', 'BIT'), + + -- begehung_waschbecken + ('begehung_waschbecken', 'engomoid', 'BIGINT NOT NULL'), + ('begehung_waschbecken', 'raum_bezeichnung', 'VARCHAR(255)'), + ('begehung_waschbecken', 'ablauf_mit_stoepsel', 'BIT'), + ('begehung_waschbecken', 'doppelhandtuchhalter', 'BIT'), + ('begehung_waschbecken', 'doppelwaschbecken', 'BIT'), + ('begehung_waschbecken', 'doppelwaschtisch', 'BIT'), + ('begehung_waschbecken', 'excenter_garnitur', 'BIT'), + ('begehung_waschbecken', 'handtuchhalter', 'BIT'), + ('begehung_waschbecken', 'handtuchhaken', 'BIT'), + ('begehung_waschbecken', 'konsole', 'BIT'), + ('begehung_waschbecken', 'seifenschale', 'BIT'), + ('begehung_waschbecken', 'spiegelleuchte', 'BIT'), + ('begehung_waschbecken', 'waschbecken', 'BIT'), + + -- begehung_toilette + ('begehung_toilette', 'engomoid', 'BIGINT NOT NULL'), + ('begehung_toilette', 'raum_bezeichnung', 'VARCHAR(255)'), + ('begehung_toilette', 'sitz_mit_deckel', 'BIT'), + ('begehung_toilette', 'sitz_mit_deckel_softclose', 'BIT'), + ('begehung_toilette', 'toilettenpapierhalter', 'BIT'), + + -- begehung_stammdaten + ('begehung_stammdaten', 'Vertrag', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Wirtschaftseinheit', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Mietobjekt', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Strasse_und_Hausnummer', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Postleitzahl', 'NVARCHAR(20)'), + ('begehung_stammdaten', 'Ort', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'LeerstBeleg_ab', 'DATE'), + ('begehung_stammdaten', 'Geschoss_Kurzbez', 'NVARCHAR(50)'), + ('begehung_stammdaten', 'Lage_im_Geschoss', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Anzahl_Raeume', 'INT'), + ('begehung_stammdaten', 'Anzahl_halbe_Raeume', 'INT'), + ('begehung_stammdaten', 'Hauptnutzflaeche', 'DECIMAL(18,2)'), + ('begehung_stammdaten', 'Geschaeftspartner', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Mietername', 'NVARCHAR(255)'), + ('begehung_stammdaten', 'Name_weiterer_Mieter', 'NVARCHAR(255)'); + +-- Deklariere Variablen für die Tabellen-Schleife +DECLARE @CurrentSuffix NVARCHAR(128); +DECLARE @FullTableName NVARCHAR(256); +DECLARE @CreateTableColumns NVARCHAR(MAX); +DECLARE @SQL_CREATE NVARCHAR(MAX); -- Korrigierte Deklaration + +-- 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 = 'begehung_' + @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 + -- Die Spalteninformationen werden aus @ColumnsToAdd gefiltert + + SET @CreateTableColumns = ( + SELECT STRING_AGG('[' + ColumnName + '] ' + ColumnType, ', ') + 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 + PRINT 'Fehler beim Erstellen der Tabelle ' + @FullTableName + ': ' + ERROR_MESSAGE(); + 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; + +-- Füge den PRIMARY KEY für jede Tabelle hinzu, die engomoid hat +DECLARE @CurrentTable NVARCHAR(128); +DECLARE @PKName NVARCHAR(128); +DECLARE @AddPKSQL NVARCHAR(MAX); + +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 + PRINT 'Fehler beim Hinzufügen des Primary Keys zu ' + @CurrentTable + ': ' + ERROR_MESSAGE(); + 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; + +-- Deklariere Variablen für die Spalten-Schleife +DECLARE @TargetTable NVARCHAR(128); +DECLARE @CurrentColumn NVARCHAR(128); +DECLARE @ColumnType NVARCHAR(128); +DECLARE @AddColumnSQL NVARCHAR(MAX); + +-- Deklariere und öffne einen Cursor, um durch die Spalten zu iterieren +DECLARE column_cursor CURSOR FOR + SELECT TableName, ColumnName, ColumnType FROM @ColumnsToAdd; + +OPEN column_cursor; + +FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn, @ColumnType; + +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'] ' + @ColumnType + N';'; + + -- 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, @ColumnType; +END + +-- Schließe und deallokiere den Spalten-Cursor +CLOSE column_cursor; +DEALLOCATE column_cursor; + +-- Deklariere Variablen für die Lösch-Schleife +DECLARE @ExistingColumnLoop NVARCHAR(128); +DECLARE @DeleteColumnSQL NVARCHAR(MAX); + +-- 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 + PRINT 'Fehler beim Löschen der Spalte ' + @ExistingColumnLoop + ' aus ' + @TargetTable + ': ' + ERROR_MESSAGE(); + 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 + PRINT 'Fehler beim Überprüfen/Löschen von Spalten in ' + @TargetTable + ': ' + ERROR_MESSAGE(); + 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;