toxic1982
Goto Top

SQL Datenbank per Script aktualisieren

Guten Tag!

Ich suche nach einer einfachen Möglichkeit eine SQL Datenbank zu aktualisieren.

Hintergrund:
Wir nutzen ein Programm das wir ständig weiter entwickeln und somit auch ständig SQL Tabellen und Felder hinzufügen. Nun möchte ich aber, wenn es sich vermeiden
lässt, nicht bei jedem, der dieses Programm seit z.b. 10 Jahren nutzt händisch Felder und Tabellen nachpflegen sondern ein Script haben, das diese aktualisiert.


Eine Tabelle sieht z.b. so aus:

[DINTERN] [int] IDENTITY (1, 1) NOT NULL ,
[OLDDINTERN] [int] NULL ,
[1INTERN] [int] NOT NULL ,
[2] [int] NOT NULL ,
[3] [datetime] NULL ,
[4] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[5] [int] NULL ,
[6] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[7] [int] NULL ,
[8] [real] NULL ,
[9] [real] NULL ,
[10] [real] NULL ,
[11] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[12] [varchar] (5) COLLATE Latin1_General_CI_AS NOT NULL ,
[13] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[14] [int] NULL ,
[15] [varchar] (30) COLLATE Latin1_General_CI_AS NULL ,
[16] [smallint] NOT NULL

Wobei 1intern, 2 und 16 Primärschlüssel sind.

So, müßte ich durch ca. 120 Tabellen gehen und Felder Aktualisieren.

Ich hoffe, ihr könnt mir helfen diese oft müßige Arbeit zu umgehen.

Danke im Vorraus.

Gruß
Erik

Content-Key: 136078

Url: https://administrator.de/contentid/136078

Ausgedruckt am: 29.03.2024 um 12:03 Uhr

Mitglied: Tommy70
Tommy70 16.02.2010 um 14:02:29 Uhr
Goto Top
Hallo,

schon mal mit einem SQL-Script probiert das du im Mangment Studio von der Datenbank oder der Tabelle erstellen kannst?
Mitglied: Toxic1982
Toxic1982 16.02.2010 um 14:15:08 Uhr
Goto Top
Hi Tommy70!

Ich habe es gerade versucht. Neue Tabellen werden mit diesem Script korrekt angelegt. Aber Felder werden nicht in vorhandene Tabellen eingefügt.
Am liebsten würde ich die Tabellen löschen und neu anlegen lassen... ist allerdings nicht möglich da in diesen Tabellen ja auch Daten stehen.

Leider bin ich kein SQL Profi. Hast du sonst noch eine Idee?

Edit:
Habe grad nochmal Versucht, was passiert, wenn ich selbst ein Script erstelle. Hier ist allerdings das Problem, wenn ein Feld schon existiert, bricht der Vorgang ab:

alter TABLE WXXXXX add TCPIP varchar(20) NULL
alter Table WXXXXXX add LOGZEIT datetime NULL

Meldung 2705, Ebene 16, Status 4, Zeile 2
Spaltennamen müssen in jeder Tabelle eindeutig sein. Der Spaltenname 'TCPIP' wurde in der 'WXXXXX'-Tabelle mehrmals angegeben.
Mitglied: Tommy70
Tommy70 16.02.2010 um 14:39:40 Uhr
Goto Top
Wenn du die Tabelle bearbeitest kannst du kannst du dir über das Menü Tabellen-Designer ein Änderungsscript generieren lassen.
Mitglied: Firepower
Firepower 16.02.2010 um 15:20:55 Uhr
Goto Top
Hi,
musst du neue Spalten in die Tabelle einfügen, oder nur die vorhandenen Daten ändern ?!

Weil Daten ändern geht mit update.

Also
UPDATE tabellenname SET spalte = Wert; <- ändert alle Spaltenwerte in jedem Datensatz

Wenn nur bestimmte Daten geändert werden sollen mit WHERE Klausel.

UPDATE tabellenname SET spalte = Wert
WHERE spalte=Wert; <- ändert nur die Spaltenwerte welche mit der WHERE Klausel übereinstimmen.

Werte als VARCHAR müssen natürlich in Anführungsstriche, auch in der WHERE Klausel

Als Beispiel: Datenbank mit Angestellten und Personalnummer:

Nr. | Name | Vorname | Adresse | Gehalt
1 | Musterman | Klaus | Teststr. | 2000
2 | Tester | Willi |Musterstr. | 2500

UPDATE tabelle SET Gehalt=5000; <- Ändert für alle das Gehalt auf 5000

UPDATE tabelle SET Gehalt=5000
WHERE Nr.=1; <-- Ändert Gehalt nur für Mitarbeiter 1

Neue Spalten machst du, wie du oben schon geschrieben hast mit

ALTER TABLE tabelle ADD Spaltenname TYP;

Wenn diese Spalte aber schon existiert, bekommst du oben angegebene Fehlermeldung.


Wenn Fragen, dann meld dich.
Mitglied: Toxic1982
Toxic1982 16.02.2010 um 15:30:07 Uhr
Goto Top
Hi Firepower!

Ich muß Spalten und Tabellen in vorhandene Datenbanken einfügen.

Die Problematik ist ja die, das der SQL Server diese Fehlermeldung bringt und dann das Script beendet. Würde er sie bringen und das Script weiterführen,
währ das optimal. Würde ich für jede Datenbank mein Script anpassen müssen damit wirklich nur die Felder angelegt werden die nicht vorhanden sind,
ist die Arbeit die ich davon habe ungefähr die selbe. ;)

Gibt es da nicht einen Globalen Befehl wie SET IGNORE FAILURE ? face-smile
Mitglied: Firepower
Firepower 16.02.2010 um 17:46:12 Uhr
Goto Top
Das Problem ist, wenn du das auf alle Tabellen ausführst, bekommen auch Tabellen, welche die Spalte nicht brauchen,
wie SYSTEM Tabellen, diese Spalte hinzugefügt.
Das sollte ja nicht sein.

Wenn diese Tabellen unter einem bestimmten Schema liegen, wäre das schon einfacher.

Sind die Tabellen alle unter einem bestimmten Benutzer (Schema) ?
Mitglied: Toxic1982
Toxic1982 16.02.2010 um 22:41:03 Uhr
Goto Top
Das Script führe ich doch im Query Analyzer für eine besteimmte SQL DB durch.

Am liebsten möchte ich ein Script, das durch alle Tabellen in dieser DB geht und die Entsprechenden Felder einfügt.
Falls es eines der Felder schon gibt, kommt halt eine Fehlermeldung.

z.b. in Tabelle1
sollen Feld 1,2,3,4,5,6,7,8,9,10 hinzugefügt werden. Feld 1-4 gibt es in jeder Datenbank sei sie auch noch so alt. Aber Feld 5-10 ist nur in den neuen.
In Tabelle2 sollen Feld6-8 Hinzugefügt werden allerdings würde ich im Script auch schreiben wollen, das Feld1-5 hinzugefügt werden falls es die in
einer Datenbank nicht geben sollte.

alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
alter TABLE Tabelle1 add Feld1 varchar(20) NULL

alter Table Tabelle2 add Feld1 datetime NULL
alter Table Tabelle2 add Feld2 datetime NULL
alter Table Tabelle2 add Feld3 datetime NULL
alter Table Tabelle2 add Feld4 datetime NULL
alter Table Tabelle2 add Feld5 datetime NULL
alter Table Tabelle2 add Feld6 datetime NULL
alter Table Tabelle2 add Feld7 datetime NULL
alter Table Tabelle2 add Feld8 datetime NULL

So sollten doch eigentlich nur die Tabellen die Spalten/Felder kommen, die ich angebe.

Nur, da es in Tabelle1 ja schon die Felder 1-4 gibt, bricht mir das Script schon mit der Fehlermeldung ab und erstellt die restlichen Felder nicht.

Vielleicht bin ich auch nur zu schusselig. ;)

So, dann wünsche ich noch einen schönen Abend. Firepower, danke für deine Beiträge. face-smile
Mitglied: Firepower
Firepower 17.02.2010 um 11:38:22 Uhr
Goto Top
Hi ich nochmal, noch ne Frage,

Womit arbeitest du, mit Oracle oder Microsoft ?!
Mitglied: MadMax
MadMax 17.02.2010 um 12:44:48 Uhr
Goto Top
Hallo Erik,

da gibts zwei Möglichkeiten:
1. Du fügst an jede alter-table-Zeile ein "go" an, dann wird jeder Befehl als abgeschlossene Einheit gesehen und nach dem Fehler wird zum nächsten Befehl übergegangen:
alter TABLE Tabelle1 add Feld1 varchar(20) NULL
go
alter TABLE Tabelle1 add Feld2 varchar(20) NULL
go
...

2. Du prüfst, ob die Spalte schon vorhanden ist und legst sie nur an, wenn das nicht der Fall ist, dann treten erst gar keine Fehler auf:
if object_id ('Tabelle1', 'U') is not null and ColumnProperty (object_id ('Tabelle1'), 'Feld1', 'ColumnId') is null  
	alter table Tabelle1 add add Feld1 varchar(20) NULL
if object_id ('Tabelle1', 'U') is not null and ColumnProperty (object_id ('Tabelle1'), 'Feld2', 'ColumnId') is null  
	alter table Tabelle1 add add Feld2 varchar(20) NULL
...
Der erste Teil vom if prüft, ob die Tabelle vorhanden ist, der zweite Teil, daß das Feld noch nicht vorhanden ist.

Gruß, Mad Max
Mitglied: Toxic1982
Toxic1982 18.02.2010 um 07:49:10 Uhr
Goto Top
Hi Firepower!

Sorry, MS SQL Server. Ganz vergessen zu erwähnen. face-smile


Hi Mad Max!

Danke, das werde ich nachher mal testen.
Mitglied: Toxic1982
Toxic1982 19.02.2010 um 23:06:01 Uhr
Goto Top
So, nochmal herzlichen Dank. Hat wunderbar geklappt. Das Script ist fertig und läuft. Mit ein paar Verbessungen ist es perfekt. face-smile

Also, danke und schönen Abend noch. face-smile