ALTER TABLE ändert eine bestehende Basistabelle. Sie können Spalten und dazu gehörende Indizes hinzufügen, Spalten ändern oder löschen und Integritätsbedingungen hinzufügen oder löschen.
Der mit CREATE SPACE .. PCTFREE für die Freiplatzreservierung festgelegte Wert wird dabei berücksichtigt.
Bei einer CALL-DML-Tabelle können Sie nur Spalten und dazu gehörende Indizes hinzufügen, Spalten ändern oder löschen. Die für CALL-DML-Tabellen geltenden Einschränkungen sind im Abschnitt „Besonderheiten für CALL-DML-Tabellen" beschrieben..
Eine BLOB-Tabelle kann mit ALTER TABLE geändert werden. Im Abschnitt „Besonderheiten für BLOB-Tabellen" ist beschrieben, was dabei zu beachten ist.
Beim Hinzufügen (ohne Angabe eines Index), Ändern oder Löschen der Spalte einer Tabelle (ADD ohne ADD INDEX, ALTER, DROP) können Sie das Pragma UTILITY MODE verwenden. Durch Einschalten des Pragmas (UTILITY MODE ON) wird die zugehörige Anweisung wie eine Utility-Anweisung außerhalb einer Transaktion durchgeführt. Sie unterbinden damit die normale Transaktionssicherung für die entsprechende Anweisung, wodurch die Performance bei umfangreichen Datenänderungen erheblich beschleunigt werden kann. Im Fehlerfall ist das Rücksetzen der Anweisung allerdings nicht mehr möglich. Der Space, auf dem die zu ändernde Basistabelle liegt, ist defekt und muss repariert werden (siehe Abschnitt „Pragma UTILITY MODE").
Die Tabellenart können Sie mit ALTER TABLE nicht ändern! Änderungen der Tabellenart nehmen Sie mit der UTILITY-Anweisung MIGRATE vor (siehe Handbuch „ SQL-Sprachbeschreibung Teil 2: Utilities“).
Welche Basistabellen definiert sind, erfahren Sie im View BASE_TABLES des INFORMA-TION_SCHEMA (siehe Kapitel „Informationsschemata").
Der aktuelle Berechtigungsschlüssel muss Eigentümer des Schemas sein, zu dem die Basistabelle gehört.
ALTER TABLE
tabelle
{
ADD [COLUMN]
spaltendefinition ,...
[ADD INDEX
indexdefinition ,... [USING SPACE
space ]] |
ALTER [COLUMN]
spalte aktion [,
spalte aktion ] ...
[USING FILE
fehlerdatei [PASSWORD
kennwort ]] |
DROP [COLUMN]
spalte,... { CASCADE | RESTRICT } |
ADD [CONSTRAINT
integritätsbedingungsname ]
tabellenbedingung
[,[CONSTRAINT
integritätsbedingungsname ]
tabellenbedingung ],... |
DROP CONSTRAINT
integritätsbedingungsname { CASCADE | RESTRICT }
}
aktion ::=
{
DROP DEFAULT |
SET
datentyp [CALL DML
call_dml_voreinst ] |
SET
voreinstellung
}
indexdefinition ::=
index ({
spalte [LENGTH
länge ]},...)
voreinstellung ::= DEFAULT
{
alphanumerisches_literal
national_literal
numerisches_literal
zeit_literal
CURRENT_DATE
CURRENT_TIME(3)
LOCALTIME(3)
CURRENT_TIMESTAMP(3)
LOCALTIMESTAMP(3)
USER
SYSTEM_USER
NULL
REF(
tabelle )
}
tabelle
Name einer Basistabelle.
ADD [COLUMN] spaltendefinition,...
Fügt der Basistabelle neue Spalten hinzu. Die neuen Spalten werden nach den vorhandenen Spalten eingefügt. spaltendefinition definiert die Spalten, siehe Abschnitt „Spaltendefinition".
Enthält eine spaltendefinition einen von NULL verschiedenen Defaultwert, so wird dieser in alle vorhandenen Sätze der Tabelle eingefügt; dies kann je nach Anzahl der vorhandenen Sätze entsprechend dauern.
Sie dürfen in spaltendefinition keine Primärschlüsselbedingung definieren.
Jeder Berechtigungsschlüssel, der Tabellenprivilegien für die zu Grunde liegende Basistabelle besitzt, erhält automatisch die entsprechenden Privilegien für die neu hinzugefügten Spalten.
Soll eine FOR REF-Spalte angefügt werden, so ist es sinnvoll die Spalte zunächst nicht mit der FOR REF-Klausel zu definieren, denn in diesem Fall würde die Voreinstellung für die REF-Spalte in jede Zeile der Spalte eingetragen werden. Effizienter in Bezug auf den Speicherbedarf ist es, zunächst die Spalte mit dem Datentyp CHAR(237) zu definieren. Bei dieser Spaltendefinition wird in jede Zeile der NULL-Wert eingetragen. Danach kann die Spalte mit ALTER COLUMN spalte SET DEFAULT REF(tabelle) geändert werden. Dies beeinflusst bis dahin bestehende Zeileneinträge nicht mehr.
ADD INDEX indexdefinition
Definition eines oder mehrerer Indizes für die neu eingefügten Spalten.
Bei der Index-Definition gelten die Regeln und Randbedingungen der CREATE IN-DEX-Anweisung, siehe Abschnitt „CREATE INDEX - Index erzeugen"
index
Name des neuen Index.
spalte
Name der Spalte der Basistabelle, die zum Index gehören soll. Es dürfen nur Spalten angegeben werden, die in der ADD COLUMN-Klausel spezifiziert sind.
LENGTH länge
Gibt an, bis zu welcher Länge die Spalte in den Index einbezogen werden soll.
LENGTH länge nicht angegeben:
Die Spalte wird in ihrer ganzen Länge in Bytes in den Index einbezogen.
USING SPACE space
Name des Space, in dem der oder die Indizes gespeichert werden sollen.
Der Space muss bereits für die Datenbank, zu der die Tabelle gehört, definiert sein. Der aktuelle Berechtigungsschlüssel muss Eigentümer des Space sein.
USING SPACE space nicht angegeben:
Der Index wird im Space der Basistabelle gespeichert. Bei einer partitionierten Tabelle wird der Index auf dem Space der ersten Partition gespeichert.
ALTER [COLUMN] spalte
spalte ist der Name der Spalte, die geändert werden soll.
Die Änderungen der Spalte werden in der folgenden Reihenfolge ausgeführt:
DROP DEFAULT
SET datentyp
SET voreinstellung
Für eine Spalte darf dieselbe Änderungsart nur einmal veranlasst werden.
DROP DEFAULT
Löscht die Voreinstellung (SQL-Defaultwert) für die Spalte.
Die zu Grunde liegende Basistabelle darf keine CALL-DML-Tabelle sein.
SET datentyp
Neuer Datentyp der Spalte.
Die Spalte, deren Datentyp geändert werden soll, darf nicht Spalte eines Primärschlüssels sein. Bei Nur-CALL-DML-Tabellen kann auch die Spalte eines Primärschlüssels angegeben werden.
Die Spalte darf nicht in Views, Indizes, Integritätsbedingungen und Routinen vorkommen.
Auch der Datentyp einer multiplen Spalte darf geändert werden. Der Datentyp darf nicht VARCHAR oder NVARCHAR sein. Bei Änderung eines Datentyps in den Datentyp einer multiplen Spalte weist SESAM/SQL dem ersten Spaltenelement die Positionsnummer 1 zu. Die Anzahl der Spaltenelemente entspricht der Dimension des neuen Datentyps.
Eine atomare Spalte kann den Datentyp einer multiplen Spalte erhalten und umgekehrt. SESAM/SQL betrachtet den atomaren Wert dann wie den Wert einer multiplen Spalte der Dimension 1.
Der ursprüngliche Datentyp einer Spalte ist nur in bestimmte Zieldatentypen änderbar. Folgende Tabelle zeigt, welche ursprünglichen Datentypen Sie mit welchen neuen Datentypen kombinieren dürfen und welche Kombinationen nicht oder nur eingeschränkt zugelassen sind.
Ursprüng-licher Datentyp | Neuer | Neuer | Neuer | Neuer | Neuer | Neuer | Neuer | Neuer | Neuer |
INTEGER SMALL-INT DECIMAL NUMERIC | REAL DOUBLE FLOAT | VAR-CHAR | CHAR | NVAR-CHAR | NCHAR | DATE | TIME(3) | TIME-STAMP (3) | |
INTEGER SMALLINT DECIMAL NUMERIC | ja | ja 1 | nein | ja | nein | ja 1 | nein | nein | nein |
REAL DOUBLE FLOAT | ja | ja | nein | ja | nein | ja | nein | nein | nein |
VARCHAR | nein | nein | ja 2 | nein | nein | nein | nein | nein | nein |
CHAR | ja | ja 1 | nein | ja | nein | ja4 | ja 1 | ja 1 | ja 1 |
NVAR-CHAR | nein | nein | nein | nein | ja 3 | nein | nein | nein | nein |
NCHAR | ja | ja | nein | ja4 | nein | ja | ja | ja | ja |
DATE | nein | nein | nein | ja | nein | ja | ja | nein | nein |
TIME(3) | nein | nein | nein | ja | nein | ja | nein | ja | nein |
TIME-STAMP(3) | nein | nein | nein | ja | nein | ja | nein | nein | ja |
Tabelle 49: Zulässige und verbotene Kombinationen beim Ändern von Datentypen
1)Eine Spalte darf in die numerischen Datentypen REAL, DOUBLE PRECISION und FLOAT sowie in die Zeit-Datentypen DATE, TIME und TIMESTAMP nur dann geändert werden, wenn die zu Grunde liegende Basistabelle eine SQL-Tabelle ist.
2)Eine Spalte des Datentyps VARCHAR darf nur in den neuen Datentyp VARCHAR mit neue_länge >= alte_länge geändert werden. Die übrigen Datentypen dürfen nicht in den Datentyp VARCHAR geändert werden und umgekehrt.
3)Eine Spalte des Datentyps NVARCHAR darf nur in den neuen Datentyp NVARCHAR mit neue_länge >= alte_länge geändert werden. Die übrigen Datentypen dürfen nicht in den Datentyp NVARCHAR geändert werden und umgekehrt.
4) Für die Datenbank muss eine Code-Tabelle ungleich _NONE_ definiert sein.
SESAM/SQL konvertiert satzweise alle Werte von spalte in den neuen Datentyp. Bei multiplen Spalten konvertiert SESAM/SQL die signifikanten Werte aller Ausprägungen, deren Positionsnummer kleiner oder gleich der Dimension des neuen Datentyps ist. Dabei kann sich die Position eines Elements innerhalb der multiplen Spalte ändern: Ist das Ergebnis der Konvertierung für ein Spaltenelement der NULL-Wert, werden alle nachfolgenden Elemente, deren Positionsnummer kleiner oder gleich der Dimension des neuen Datentyps ist, nach links verschoben, der NULL-Wert wird hinten angehängt. Bei der Konvertierung eines Spaltenwerts gelten (außer bei CHAR <-> NCHAR) die gleichen Regeln wie bei der Konvertierung eines Werts durch den CAST-Ausdruck (siehe „Regeln für die Konvertierung eines Wertes in einen anderen Datentyp"). Bei der Konvertierung eines Spaltenwerts von CHAR nach NCHAR und umgekehrt gelten die gleichen Regeln wie bei der Transliteration eines Werts durch den TRANSLATE-Ausdruck, bei dem in der USING-Klausel CATALOG_DEFAULT verwendet wird (siehe Abschnitt „TRANSLATE() - Zeichenkette transliterieren bzw. transcodieren"). Diese Regeln gelten auch für die Konvertierung des Spaltenelement-Wertes einer multiplen Spalte.
Tritt ein Konvertierungsfehler auf, erhalten Sie eine Fehlermeldung oder Warnung.
Das Runden eines Wertes ist kein Konvertierungsfehler.
Beispiel
Eine Spalte vom Datentyp NUMERIC wird in den Datentyp INTEGER geändert.
SESAM/SQL konvertiert den ursprüngliche Spaltenwert 450,25 in den Wert 450 ohne eine Warnung auszugeben.
Bei Konvertierungsfehlern unterscheidet SESAM/SQL zwischen abgeschnittenen Zeichenketten, abgeschnittenen Spaltenelementen und nicht konvertierbaren Werten:
Abgeschnittene Zeichenketten
Eine Spalte vom Datentyp CHAR bzw. NCHAR soll in einen neuen CHAR- bzw. NCHAR-Datentyp mit kürzerer Länge geändert werden. Zugehörige Spaltenwerte,die länger sind, werden auf die Länge des neuen Datentyps gekürzt.
Werden Zeichen entfernt, die keine Leerzeichen sind, gibt SESAM/SQL eine Warnung aus.Beispiel
Der Wert 'Kundendienst' einer Spalte vom alphanumerischen Datentyp CHAR(12) bzw. vom National-Datentyp NCHAR(12) soll in den Datentyp CHAR(6) bzw. NCHAR(6) konvertiert werden. Der ursprüngliche Spaltenwertwird ersetzt durch den Wert 'Kunden'. SESAM/SQL gibt eine Warnung aus.Abgeschnittene Spaltenelemente
Eine multiple Spalte enthält mindestens ein Spaltenelement, dessen Positionsnummer größer ist als die Dimension des neuen Datentyps und das einen signifikanten Wert ungleich dem NULL-Wert enthält.Beispiel
Eine multiple Spalte des alphanumerischen Datentyps (7) CHAR (20) bzw. des National-Datentyps (7) NCHAR (20) soll in den Datentyp (5) CHAR (20) bzw. (5) NCHAR (20) konvertiert werden. Bei einigen Tabellensätzen enthalten alle 7 Elemente der multiplen Spalte einen alphanumerischen Wert.Nicht konvertierbare Werte
Durch eine Datentypänderung kommt es bei bestimmten Spaltenwerten zu einem Wertverlust mit Fehlermeldung (data exception).Beispiele
Der Betrag des Wertes einer ursprünglich numerischen Spalte ist für den numerischen Zieldatentyp zu groß.
Beispiel
Der Wert 9999 einer Spalte vom Datentyp INTEGER soll in den Datentyp NUMERIC(2,0) konvertiert werden.Eine Spalte vom alphanumerischen Datentyp CHAR bzw. vom National-Datentyp NCHAR wird in einen numerischen Datentyp geändert. Der ursprüngliche Wert der Spalte ist nicht als numerischer Wert darstellbar.
Beispiel
Der Wert 'Otto' einer Spalte vom alphanumerischen Datentyp CHAR(4) bzw. vom National-Datentyp NCHAR(4) soll in den Datentyp INTEGER konvertiert werden.Die Länge des Wertes einer ursprünglich numerischen Spalte oder der Spalte eines Zeit-Datentyps ist für den alphanumerischen Zieldatentyp CHAR bzw. für den National-Datentyp NCHAR zu groß.
Beispiel
Der Wert 9999 einer Spalte vom Datentyp INTEGER soll in den alphanumerischen Datentyp CHAR(2) bzw. in den National-Datentyp NCHAR(2) konvertiert werden.
Enthält die Spaltendefinition von spalte eine Voreinstellung, darf der neue Datentyp keine Dimension enthalten.Ist der voreingestellte SQL-Defaultwert ein alphanumerisches Literal, ein NationalLiteral, ein numerisches Literal oder ein Zeit-Literal, so wird er in den neuen Datentyp konvertiert. Die Konvertierung darf nicht zu einem Konvertierungsfehler führen.Ist der voreingestellte SQL-Defaultwert eine Zeitfunktion, ein Spezial-Literal oder der NULL-Wert, wird er beibehalten.Nach der Konvertierung muss der SQL-Defaultwert - bezogen auf den neuen Datentyp - den Zuweisungsregeln für Defaultwerte genügen (siehe Abschnitt „Defaultwerte für Tabellenspalten").
CALL DML call_dml_voreinst
Ändert den nicht signifikanten Wert der Spalte einer CALL-DML-Tabelle. Darf nur für CALL-DML-Tabellen angegeben werden!
call_dml_voreinst entspricht dem nicht-signifikanten Attributwert der SESAM/SQL-Version 1.x.
Sie geben call_dml_voreinst als alphanumerisches Literal an.
CALL DML call_dml_voreinst nicht angegeben:
Bezieht sich die Datentypänderung auf die Spalte einer CALL-DML/SQL-Tabelle, so behält spalte den ihr in der Spaltendefinition zugeordneten nicht-signifikanten Attributwert.
Bezieht sich die Datentypänderung auf die Spalte einer Nur-CALL-DML-Tabelle, also einer Tabelle mit „alten“ Attributformaten aus den SESAM-Versionen < V13.1, so erhält spalte folgenden nicht-signifikanten Attributwert:
das Leerzeichen, wenn der Datentyp von spalte alphanumerisch ist
die Ziffer 0, wenn der Datentyp von spalte numerisch ist.
SET voreinstellung
Legt einen neuen SQL-Defaultwert für die Spalte fest.
Die zu Grunde liegende Basistabelle darf keine CALL-DML-Tabelle sein.
spalte darf keine multiple Spalte sein.
voreinstellung muss den Zuweisungsregeln für Defaultwerte genügen (siehe Abschnitt „Defaultwerte für Tabellenspalten").
Die Voreinstellung wird zu dem Zeitpunkt ausgewertet, wenn ein Satz eingefügt bzw. geändert wird und für die Spalte spalte der Defaultwert verwendet wird.
USING FILE fehlerdatei [PASSWORD kennwort]
Legt den Namen für die Fehlerdatei fest. fehlerdatei müssen Sie als alphanumerisches Literal angeben.
SESAM/SQL legt die Fehlerdatei an bzw. verwendet sie nur, wenn eine Spaltenänderung mit SET datentyp zu einem oder mehreren Konvertierungsfehlern führt (siehee "ALTER TABLE - Basistabelle ändern").
Bei Angabe einer Fehlerdatei wird eine Anweisung, die zu einem Konvertierungsfehler führt, fortgesetzt. SESAM/SQL gibt eine Warnung aus und ersetzt in der betroffenen Basistabelle die ursprünglichen Spaltenwerte durch neue Werte:
Abgeschnittene Zeichenketten werden jeweils durch den entsprechenden gekürzten Wert ersetzt.
Nicht konvertierbare Werte werden durch den NULL-Wert ersetzt.
Spaltenelemente einer multiplen Spalte, deren Positionsnummer größer ist als die Dimension des neuen Datentyps, werden abgeschnitten.
SESAM/SQL protokolliert die ursprünglichen Spaltenwerte sowie abgeschnittene Spaltenelemente zusammen mit der zugehörigen Warnung oder Fehlermeldung in die Fehlerdatei.
Auch wenn UTILITY MODE ON eingeschaltet ist, wird eine Anweisung, die zu einem Konvertierungsfehler führt, nicht abgebrochen. Der Space, auf dem die zu ändernde Basistabelle liegt, bleibt in diesem Fall intakt.
Eine genaue Beschreibung der Fehlerdatei und ihres Inhalts finden Sie im Abschnitt „Fehlerdatei der SQL-Anweisung ALTER TABLE".
PASSWORD kennwort
BS2000-Kennwort für die Fehlerdatei. kennwort muss als alphanumerisches Literal angegeben werden.
Für die Angabe von kennwort gibt es folgende Möglichkeiten:
'
C''
zeichenkette'''
zeichenkette enthält vier abdruckbare Zeichen.'
X''
hex-zeichenkette'''
hex-zeichenkette enthält acht sedezimale Zeichen.'
n'
n bezeichnet eine ganze Zahl von - 2147483648 bis + 2147483647
USING FILE fehlerdatei nicht angegeben:
Führt eine Spaltenänderung mit SET datentyp zu Konvertierungsfehlern, protokolliert SESAM/SQL die betroffenen Spaltenwerte bzw. Spaltenelemente nicht in eine Fehlerdatei.
Abgeschnittene Zeichenketten werden auf die Länge des neuen Datentyps gekürzt und SESAM/SQL gibt eine Warnung aus.
Bei Konvertierungsfehlern wegen nicht konvertierbarer Werte oder wegen abgeschnittener Spaltenelemente bricht SESAM/SQL die zugehörige Anweisung mit Fehlermeldung ab.
DROP [COLUMN] spalte,... {CASCADE, RESTRICT}
Löscht eine oder mehrere Spalten der Basistabelle und die zugehörigen Indizes. spalte ist der Name der Spalte, die gelöscht werden soll. Derselbe Spaltenname darf nur einmal angegeben werden.
Für spalte darf keine Primärschlüsselbedingung definiert sein.
Sie dürfen nicht alle Spalten der Basistabelle angeben.
Das Löschen einer Spalte entzieht dem aktuellen Berechtigungsschlüssel die Spaltenprivilegien UPDATE und FOREIGN KEY ... REFERENCES für diese Spalte. Wurden diese Privilegien weitergegeben, werden auch die weitergegebenen Privilegien entzogen..
Mit dem Löschen einer Spalte werden außerdem alle Views gelöscht, in deren Definitionn spalte verwendet wird, sowie alle Views, deren Definition den Namen eines solchen „übergeordneten“ View enthält.
Die Anordnung der verbleibenden Spalten der Tabelle kann sich ändern: Entsteht durch das Löschen einer Spalte eine Lücke, so werden alle nachfolgenden Spalten nach links aufgeschlossen.
CASCADE
Die benannte(n) Spalte(n) und zugehörige Indizes werden gelöscht.
Integritätsbedingungen anderer Tabellen oder Spalten, die spalte verwenden, werden ebenfalls gelöscht. Alle Routinen werden gelöscht, die sich direkt oder indirekt auf diese Spalte beziehen.
Die Verwendung des Pragmas UTILITY MODE ist nicht möglich. Schalten Sie das Pragma UTILITY MODE ein, so erhalten Sie eine Fehlermeldung und die Anweisung wird abgebrochen.
RESTRICT
Das Löschen einer Spalte ist nur eingeschränkt möglich:
Die Spalte kann nicht gelöscht werden, wenn sie in einer View-Definition oder in einer Routine verwendet wird. Für die zu löschende Spalte darf nur dann ein Index definiert sein, wenn keine der verbleibenden Spalten der Basistabelle in der betreffenden Indexdefinition benannt ist. Entsprechendes gilt für Integritätsbedingungen.
Das Pragma UTILITY MODE kann eingeschaltet werden, wenn für die Spalte kein Index definiert ist.
ADD CONSTRAINT-Klausel
Fügt der Basistabelle Integritätsbedingungen hinzu.
CONSTRAINT integritätsbedingungsname
Vergibt einen Namen für die Integritätsbedingung. Der einfache Name der Integritätsbedingung kann durch einen Datenbank- und Schemanamen qualifiziert werden. Der Datenbank- und Schemaname muss mit dem Datenbank- und Schemanamen der Basistabelle übereinstimmen.
CONSTRAINT integritätsbedingungsname nicht angegeben:
Die Integritätsbedingung erhält einen Namen nach folgendem Schema:
UN integritätsbedingungsnummer
FK integritätsbedingungsnummer
CH integritätsbedingungsnummer
wobei UN für UNIQUE, FK für FOREIGN KEY und CH für CHECK steht.
integritätsbedingungsnummer ist eine 16-stellige Nummer.
tabellenbedingung
Gibt eine Integritätsbedingung für die Tabelle an. tabellenbedingung darf keine Primärschlüsselbedingung definieren.
DROP CONSTRAINT integritätsbedingungsname {CASCADE, RESTRICT}
Löscht die Integritätsbedingung integritätsbedingungsname.
integritätsbedingungsname darf keine Primärschlüsselbedingung benennen.
CASCADE
Ist integritätsbedingungsname eine Eindeutigkeitsbedingung, und bezieht sich die Referenzbedingung einer anderen Tabelle auf die Spalte(n), für die integritätsbedingungsnamee definiert wurde, so wird implizit auch die Referenzbedingung der anderen Tabelle gelöscht.
RESTRICT
Sie dürfen keine Eindeutigkeitsbedingung für eine Spalte löschen, solange eine Referenzbedingung einer anderen Tabelle sich auf die betreffende(n) Spalte(n) bezieht.
Besonderheiten für CALL-DML-Tabellen
Bei der ALTER TABLE-Anweisung müssen für CALL-DML-Tabellen folgende Einschränkungen berücksichtigt werden:
Es sind nur die Klauseln ADD [COLUMN], DROP [COLUMN] und ALTER [COLUMN] mit SET datentyp erlaubt.
Eine neu hinzugefügte Spalte muss eine CALL-DML-Klausel enthalten.
Es sind nur die Datentypen CHAR, NUMERIC, DECIMAL, INTEGER oder SMALLINT erlaubt.
Für die Spalte darf keine Integritätsbedingung und mit DEFAULT kein voreingestellter Wert definiert werden.
Der Spaltenname muss sich vom Integritätsbedingungsnamen der Tabellenbedingung unterscheiden, da dieser Name als Name des zusammengesetzten Primärschlüssels verwendet wird.
Der Datentyp der Spalte einer CALL-DML-Tabelle darf nur in den Datentyp einer CALL-DML/SQL-Tabelle geändert werden. Insbesondere darf der Datentyp einer CALL-DML-Tabelle nicht in ein „altes Attributformat“ geändert werden, d.h. in ein Attributformat der SESAM-Version <13.1.
Ein „altes Attributformat“ einer Nur-CALL-DML-Tabelle kann in folgende Datentypen geändert werden:
CHAR mit neue_länge >= alte_länge
NUMERIC mit alter_bruchteil=neuer_bruchteil
DECIMAL mit alter_bruchteil=neuer_bruchteil
INTEGER
SMALLINT
Für Spalten einer CALL-DML-Tabelle können Sie einen neuen nicht-signifikanten Attributwert vergeben. Den symbolischen Attributnamen dürfen Sie nicht ändern.
Führt eine Datentypänderung dazu, dass der Wert einer CALL-DML-Spalte den nichtsignifikanten Attributwert annimmt, gilt der Wert der betreffenden Spalte als nicht konvertierbar. Wurde keine Fehlerdatei angegeben, gibt SESAM/SQL eine Fehlermeldung aus und bricht die Anweisung ab. Bei Angabe einer Fehlerdatei verfährt SESAM/SQL wie bei nicht konvertierbaren Werten einer SQL-Tabelle (siehe "ALTER TABLE - Basistabelle ändern").
Die Tabellenart können Sie weder mit der ALTER [COLUMN]-Klausel ändern noch mit der DROP [COLUMN]-Klausel. Auch wenn die Spalten einer Nur-CALL-DML-Tabelle so geändert bzw. gelöscht wurden, dass keine Spalte ein „altes Attributformat“ enthält, bleibt die Tabellenart „Nur-CALL-DML-Tabelle“ erhalten. Änderungen der Tabellenart nehmen Sie mit der UTILITY-Anweisung MIGRATE vor (siehe Handbuch „ SQL-Sprachbeschreibung Teil 2: Utilities“).
Konvertierung von „alten“ Attributen in einer Nur-CALL-DML-Tabelle
Ein Attribut einer Nur-CALL-DML-Tabelle hat keinen expliziten Typ; der Typ wird lediglich durch die Art der Abspeicherung vorgegeben. Der Anwender sorgt selbst für die richtige Interpretation der Werte.
Bei ALTER COLUMN kann keine Änderung des Typs stattfinden, sondern nur eine Übertragung in den angegebenen Typ. Dabei werden Werte mit passendem Typ übernommen und Werte mit nicht passendem Typ abgewiesen (SQLSTATE 22SA5).
Deshalb darf nur der passende Typ angegeben werden. Eine Konvertierung in einen anderen Typ ist nur durch einen zweiten ALTER COLUMN und Angabe eines neuen Datentyps möglich.
Z.B. lässt sich ein binärer Wert nur umwandeln in INTEGER, SMALLINT. Nach dem zweiten ALTER COLUMN lässt er sich auch umwandeln in NUMERIC, DECIMAL und CHAR.Bei der Bearbeitung des ALTER COLUMN wird jeder Wert gelesen und entsprechend seiner Definition in der Nur-CALL-DML-Tabelle aufbereitet. Bündigkeit, Füllbytes usw. werden dabei berücksichtigt. Es findet aber keine Konvertierung statt. Danach wird geprüft, ob der gelesene Wert dem angegebenen Format entspricht oder nicht.
Da die Attribute der Nur-CALL-DML-Tabelle auch Werte mit verschiedenem Typ enthalten können, ist es sinnvoll, bei ALTER COLUMN für „alte“ Attribute immer USING FILE fehlerdatei anzugeben. Alle nicht passenden Werte werden dann in der Fehlerdatei abgelegt.
Ist keine Fehlerdatei vorhanden, wird der ALTER COLUMN beim ersten nicht passenden Wert abgebrochen.
Besonderheiten für BLOB-Tabellen
Auch BLOB-Tabellen können mit ALTER TABLE geändert werden. Diese Änderungen können jedoch dazu führen, dass die BLOB-Tabelle nicht mehr durch CLI-Aufrufe angesprochen werden kann. Mögliche Änderungen und deren Auswirkungen sind deshalb nachfolgend beschrieben:
Wird eine neue Spalte in eine BLOB-Tabelle eingefügt, so hat dies keine Auswirkungen auf die Durchführbarkeit von CLI-Aufrufen.
Auch zusätzliche Integritätsbedingungen auf BLOB-Tabellen können mit der ADD CONSTRAINT-Klausel ohne negative Folgen definiert werden.
Wird jedoch eine der Spalten OBJ_NR, SLICE_NR, SLICE_VAL oder OBJ_REF gelöscht oder ihr Typ geändert, so können BLOB-Werte nicht mehr mit CLI-Funktionen bearbeitet werden.
Fehlerdatei der SQL-Anweisung ALTER TABLE
Beim Ändern einer Spalte (ALTER COLUMN) können Sie den Namen einer Fehlerdatei angeben. Bei Bedarf können Sie die Fehlerdatei über ein BS2000-Kennwort schützen. Die Fehlerdatei dient zur Aufnahme von Spaltenwerten, bei denen Konvertierungsfehler auf Grund einer Datentypänderung zu Datenverlust führten.
Haben Sie eine Fehlerdatei benannt und treten bei Datentypänderungen Konvertierungsfehler auf, richtet SESAM/SQL die Fehlerdatei in der Kennung des DBH als SAM-Datei ein, sofern sie noch nicht vorhanden ist.
Soll die Fehlerdatei nicht in der DBH-Kennung liegen, müssen Vorbereitungen getroffen worden sein, siehe Abschnitt „Datenbankdateien und Jobvariablen auf fremden Benutzerkennungen“ im „ Basishandbuch“.
Bei Angabe einer Fehlerdatei wird eine Anweisung, die zu einem Konvertierungsfehler führt, nicht abgebrochen. SESAM/SQL gibt eine Warnung aus und ersetzt in der betroffenen Basistabelle die ursprünglichen Spaltenwerte durch neue Werte. Abhängig vom Fehlertyp wird der Wert jeweils durch einen gekürzten Wert oder durch den NULL-Wert ersetzt.
SESAM/SQL protokolliert die ursprünglichen Spaltenwerte zusammen mit der zugehörigen Fehlermeldung oder Warnung in die Fehlerdatei. Ist bereits eine Fehlerdatei vorhanden, so wird ihr Inhalt nicht überschrieben. Die neuen Einträge fügt SESAM/SQL an die bereits vorhandenen Einträge an.
Die Fehlerdatei unterliegt nicht der Transaktionssicherung. Sie bleibt erhalten, auch wenn implizit oder explizit die Transaktion zurückgesetzt wird, in der SESAM/SQL Einträge in die Fehlerdatei schreibt.
Den Inhalt der Fehlerdatei können Sie sich mit dem Kommando SHOW-FILE auf dem Bildschirm anzeigen lassen.
Inhalt der Fehlerdatei
Zu jedem protokollierten Spaltenwert enthält die Fehlerdatei einen Eintrag. Der Eintrag besteht aus dem jeweiligen SQL-Statuscode sowie aus Komponenten, die den Spaltenwert innerhalb der zugehörigen Basistabelle identifizieren.
eintrag ::=
satz_id
spaltenname [
posnr ]
sqlstate
spaltenwert
satz_id ::= {
primärschlüssel |
satzzähler }
satz_id
Identifiziert den Satz der Tabelle, die spaltenwert enthält. Bei Tabellen mit Primärschlüssel ist satz_id der Primärschlüsselwert, der den entsprechenden Satz eindeutig identifiziert. Seine Darstellung in der Fehlerdatei entspricht der Darstellung von spaltenwert (siehe dort). Das Gleiche gilt auch für Compound Keys.
Bei Tabellen ohne Primärschlüssel bezeichnet satz_id den Zähler des Satzes, der spaltenwert enthält. SESAM/SQL nummeriert alle Tabellensätze sequenziell durch. Der erste Satz der Tabelle erhält den Wert 1 als satzzähler.
satzzähler ist eine vorzeichenlose Ganzzahl.
spaltenname
Name der Spalte, die spaltenwert enthält. Bei multiplen Spalten enthält spaltenname auch die Positionsnummer des betreffenden Spaltenelements als vorzeichenlose Ganzzahl. Dabei hat das erste Element der multiplen Spalte die Positionsnummer 1.
sqlstate
SQLSTATE der zugehörigen Fehlermeldung bzw. Warnung.
spaltenwert
Ursprünglicher Spaltenwert, für den die ALTER TABLE-Anweisung zu einem Konvertierungsfehler geführt hat.
Abhängig vom Datentyp der zugehörigen Spalte, wird spaltenwert in der Fehlerdatei folgendermaßen dargestellt:
Datentyp der Spalte, die den | Darstellung des spaltenwert in der Fehlerdatei |
Datentyp einer CALL-DML-Tabellen | Zeichenkette mit einer maximalen Länge von |
CHAR | Zeichenkette mit einer maximalen Länge von |
NCHAR | Zeichenkette mit einer maximalen Länge von |
INTEGER, SMALLINT, | entsprechendes numerisches Literal |
FLOAT, REAL, | entsprechendes numerisches Literal |
DATE | Datum-Zeitliteral |
TIME | Uhrzeit-Zeitliteral |
TIMESTAMP | Zeitstempel-Zeitliteral |
Tabelle 50: Darstellung der Datentypen von spaltenwert
Zeichenketten werden in der Fehlerdatei ohne umgebende Hochkommata dargestellt.
Ist der ursprüngliche Wert eine Zeichenkette, die verdoppelte Hochkommata enthält, so werden diese in der Fehlerdatei als einfache Hochkommata dargestellt.
Beispiel
Das folgende Beispiel zeigt eine Fehlerdatei, die die ursprünglichen Spaltenwerte der Basistabelle LEISTUNG enthält.
Die Basistabelle LEISTUNG hat folgenden Aufbau:
SQL CREATE TABLE leistung (lnr INTEGER CONSTRAINT lnr_primary PRIMARY KEY, anr INTEGER CONSTRAINT l_anr_notnull NOT NULL, ldatum DATE, ...)
Die Einträge entstanden, nachdem die folgende Anweisung zu Konvertierungsfehlern führte:
ALTER TABLE leistung ALTER COLUMN lsatz SET NUMERIC(5,2)
USING FILE 'ERR.LEISTUNG'
Auszug aus der Fehlerdatei ERR.LEISTUNG:
satz_id spaltenname sqlstate spaltenwert 2 LSATZ 22SA4 1500 3 LSATZ 22SA4 1500 4 LSATZ 22SA4 1200 5 LSATZ 22SA4 1200 . . 11 LSATZ 22SA4 1200
Bei der Umwandlung von LSATZ von NUMERIC (5,0) in NUMERIC(5,2) können die Sätze mit dem angegebenen Primärschlüssel nicht konvertiert werden.
Beispiele
In den folgenden Beispielen werden die Tabelleneigenschaften der Tabellen KUNDE und AUFTRAG geändert:
Die Spalten KTELEFON und KINFO werden in die Tabelle KUNDE eingefügt.
ALTER TABLE kunde
ADD COLUMN ktelefon CHARACTER(25), kinfo CHARACTER(50)
Der Datentyp der Spalte KNR in der Tabelle KUNDE wird geändert.
Der ursprüngliche Datentyp war NUMERIC, der neue Datentyp ist INTEGER.
ALTER TABLE kunde
ALTER COLUMN knr SET INTEGER
Die Spalte KINFO der Tabelle KUNDE wird gelöscht.
Die Spalte KINFO wird nur gelöscht, wenn sie in keiner View-Definition verwendet wird. Für die Spalte KINFO dürfen nur dann ein Index oder eine Integritätsbedingung definiert sein, wenn keine der verbleibenden Spalten der Basistabelle in der Definition benannt ist.
ALTER TABLE kunde
DROP COLUMN kinfo RESTRICT
Der Tabelle KUNDE wird eine Eindeutigkeitsbedingung hinzugefügt, die sich auf die Spalte KNR bezieht.
ALTER TABLE kunde
ADD CONSTRAINT knr_unique UNIQUE (knr)
Die Referenzbedingung der Spalte KNR der Tabelle AUFTRAG auf die Spalte KNR der Tabelle KUNDE wird gelöscht. Sie können die Namen von verwendeten Integritätsbedingungen nachschlagen in den Views TABLE_CONSTRAINTS, REFERENTIAL_CONSTRAINTS und CHECK_CONSTRAINTS des INFORMATION-SCHEMA.
ALTER TABLE auftrag
DROP CONSTRAINT a_knr_ref_kunde CASCADE
Siehe auch
CREATE TABLE