FirebirdSQL logo
 SHADOWTABLE 

CREATE DOMAIN

Verwendet für

Erstellen einer neuen Domain

Verfügbar in

DSQL, ESQL

Syntax
CREATE DOMAIN name [AS] <datatype>
  [DEFAULT {<literal> | NULL | <context_var>}]
  [NOT NULL] [CHECK (<dom_condition>)]
  [COLLATE collation_name]

<datatype> ::=
  <scalar_datatype> | <blob_datatype> | <array_datatype>

<scalar_datatype> ::=
  !! Siehe auch Skalardatentyp-Syntax !!

<blob_datatype> ::=
  !! Siehe auch BLOB-Datentyp-Syntax !!

<array_datatype> ::=
  !! Siehe auch Array-Datentyp-Syntax !!

<dom_condition> ::=
    <val> <operator> <val>
  | <val> [NOT] BETWEEN <val> AND <val>
  | <val> [NOT] IN ({<val> [, <val> ...] | <select_list>})
  | <val> IS [NOT] NULL
  | <val> IS [NOT] DISTINCT FROM <val>
  | <val> [NOT] CONTAINING <val>
  | <val> [NOT] STARTING [WITH] <val>
  | <val> [NOT] LIKE <val> [ESCAPE <val>]
  | <val> [NOT] SIMILAR TO <val> [ESCAPE <val>]
  | <val> <operator> {ALL | SOME | ANY} (<select_list>)
  | [NOT] EXISTS (<select_expr>)
  | [NOT] SINGULAR (<select_expr>)
  | (<dom_condition>)
  | NOT <dom_condition>
  | <dom_condition> OR <dom_condition>
  | <dom_condition> AND <dom_condition>

<operator> ::=
    <> | != | ^= | ~= | = | < | > | <= | >=
  | !< | ^< | ~< | !> | ^> | ~>

<val> ::=
    VALUE
  | <literal>
  | <context_var>
  | <expression>
  | NULL
  | NEXT VALUE FOR genname
  | GEN_ID(genname, <val>)
  | CAST(<val> AS <cast_type>)
  | (<select_one>)
  | func([<val> [, <val> ...]])

<cast_type> ::= <domain_or_non_array_type> | <array_datatype>

<domain_or_non_array_type> ::=
  !! See Syntax für Skalardatentypen !!
Table 1. CREATE DOMAIN-Anweisungsparameter
Parameter Beschreibung

name

Domänenname.Die maximale Länge beträgt 63 Zeichen

datatype

SQL-Datentyp

literal

Ein Literalwert, der mit datatype kompatibel ist

context_var

Jede Kontextvariable, deren Typ mit datatype kompatibel ist

dom_condition

Domain-Bedingung

collation_name

Name einer Kollatierungssequenz, die für charset_name gültig ist, wenn sie mit datatype versorgt wird oder ansonsten für den Standardzeichensatz der Datenbank gültig ist

select_one

Eine skalare SELECT-Anweisung – Auswahl einer Spalte und Rückgabe nur einer Zeile

select_list

Eine SELECT-Anweisung, die eine Spalte auswählt und null oder mehr Zeilen zurückgibt

select_expr

Eine SELECT-Anweisung, die eine oder mehrere Spalten auswählt und null oder mehr Zeilen zurückgibt

expression

Ein Ausdruck, der in einen Wert aufgelöst wird, der mit datatype kompatibel ist

genname

Sequenzname (Generatorname)

func

Interne Funktion oder UDF

Die CREATE DOMAIN-Anweisung erstellt eine neue Domain.

Als Domaintyp kann jeder SQL-Datentyp angegeben werden.

Typspezifische Details

Array-Typen
  • Wenn die Domain ein Array sein soll, kann der Basistyp ein beliebiger SQL-Datentyp außer BLOB und Array sein.

  • Die Dimensionen des Arrays sind in eckigen Klammern angegeben.(Im Syntaxblock erscheinen diese Klammern in Anführungszeichen, um sie von den eckigen Klammern zu unterscheiden, die optionale Syntaxelemente kennzeichnen.)

  • Für jede Array-Dimension definieren eine oder zwei ganze Zahlen die untere und obere Grenze ihres Indexbereichs:

    • Arrays sind standardmäßig 1-basiert.Die untere Grenze ist implizit und nur die obere Grenze muss angegeben werden.Eine einzelne Zahl kleiner als 1 definiert den Bereich num..1 und eine Zahl größer als 1 definiert den Bereich 1..num.

    • Zwei durch einen Doppelpunkt getrennte Zahlen (‘:’) und optionales Leerzeichen, das zweite größer als das erste, können verwendet werden, um den Bereich explizit zu definieren.Eine oder beide Grenzen können kleiner als Null sein, solange die obere Grenze größer als die untere ist.

  • Wenn das Array mehrere Dimensionen hat, müssen die Bereichsdefinitionen für jede Dimension durch Kommas und optionales Leerzeichen getrennt werden.

  • Indizes werden nur validiert, wenn tatsächlich ein Array existiert.Das bedeutet, dass keine Fehlermeldungen bezüglich ungültiger Indizes zurückgegeben werden, wenn die Auswahl eines bestimmten Elements nichts zurückgibt oder wenn ein Array-Feld NULL ist.

String-Typen

Mit der CHARACTER SET-Klausel können Sie den Zeichensatz für die Typen CHAR, VARCHAR und BLOB (SUB_TYPE TEXT) angeben.Wenn der Zeichensatz nicht angegeben ist, wird der als DEFAULT CHARACTER SET angegebene Zeichensatz der Datenbank verwendet.Wenn kein Zeichensatz angegeben wurde, wird beim Erstellen einer Zeichendomäne standardmäßig der Zeichensatz NONE verwendet.

Warning

Mit dem Zeichensatz NONE werden Zeichendaten so gespeichert und abgerufen, wie sie übermittelt wurden.Daten in einer beliebigen Codierung können einer Spalte basierend auf einer solchen Domain hinzugefügt werden, aber es ist unmöglich, diese Daten zu einer Spalte mit einer anderen Codierung hinzuzufügen.Da keine Transliteration zwischen den Quell- und Zielcodierungen durchgeführt wird, können Fehler auftreten.

DEFAULT-Klausel

Mit der optionalen DEFAULT-Klausel können Sie einen Standardwert für die Domain angeben.Dieser Wert wird der Tabellenspalte hinzugefügt, die diese Domain erbt, wenn die INSERT-Anweisung ausgeführt wird, wenn kein Wert dafür in der DML-Anweisung angegeben ist.Lokale Variablen und Argumente in PSQL-Modulen, die auf diese Domain verweisen, werden mit dem Standardwert initialisiert.Verwenden Sie als Standardwert ein Literal eines kompatiblen Typs oder eine Kontextvariable eines kompatiblen Typs.

NOT NULL Constraint

Spalten und Variablen, die auf einer Domain mit der Einschränkung NOT NULL basieren, werden daran gehindert, als NULL geschrieben zu werden, d.h. ein Wert ist erforderlich.

Caution

Achten Sie beim Anlegen einer Domain darauf, keine Einschränkungen anzugeben, die sich widersprechen würden.Zum Beispiel sind NOT NULL und DEFAULT NULL widersprüchlich.

CHECK Constraint(s)

Die optionale CHECK-Klausel gibt Einschränkungen für die Domain an.Eine Domainneinschränkung gibt Bedingungen an, die von den Werten von Tabellenspalten oder Variablen erfüllt werden müssen, die von der Domain erben.Eine Bedingung muss in Klammern eingeschlossen werden.Eine Bedingung ist ein logischer Ausdruck (auch Prädikat genannt), der die booleschen Ergebnisse TRUE, FALSE und UNKNOWN zurückgeben kann.Eine Bedingung gilt als erfüllt, wenn das Prädikat den Wert TRUE oder „unknown value“ (entspricht NULL) zurückgibt. Liefert das Prädikat FALSE, ist die Annahmebedingung nicht erfüllt.

VALUE Keyword

Das Schlüsselwort VALUE in einer Domainneinschränkung ersetzt die Tabellenspalte, die auf dieser Domain basiert, oder eine Variable in einem PSQL-Modul.Es enthält den Wert, der der Variablen oder der Tabellenspalte zugewiesen wurde. VALUE kann überall in der CHECK-Bedingung verwendet werden, obwohl es normalerweise im linken Teil der Bedingung verwendet wird.

COLLATE

Mit der optionalen COLLATE-Klausel können Sie die Kollatierungssequenz angeben, wenn die Domain auf einem der String-Datentypen basiert, einschließlich BLOBs mit Textuntertypen.Wenn keine Kollatierungssequenz angegeben ist, ist die Kollatierungssequenz diejenige, die zum Zeitpunkt der Erstellung der Domain für den angegebenen Zeichensatz voreingestellt ist.

docnext count = 10

Wer kann eine Domain erstellen

Die CREATE DOMAIN-Anweisung kann ausgeführt werden durch:

CREATE DOMAIN-Beispiele

  1. Erstellen einer Domain, die Werte über 1.000 annehmen kann, mit einem Standardwert von 10.000.

    CREATE DOMAIN CUSTNO AS
      INTEGER DEFAULT 10000
      CHECK (VALUE > 1000);
  2. Erstellen einer Domain, die die Werte 'Yes' und 'No' in dem beim Erstellen der Datenbank angegebenen Standardzeichensatz annehmen kann.

    CREATE DOMAIN D_BOOLEAN AS
      CHAR(3) CHECK (VALUE IN ('Yes', 'No'));
  3. Erstellen einer Domain mit dem Zeichensatz UTF8 und der Kollatierungssequenz UNICODE_CI_AI.

    CREATE DOMAIN FIRSTNAME AS
      VARCHAR(30) CHARACTER SET UTF8
      COLLATE UNICODE_CI_AI;
  4. Erstellen einer Domain vom Typ DATE, die NULL nicht akzeptiert und das aktuelle Datum als Standardwert verwendet.

    CREATE DOMAIN D_DATE AS
      DATE DEFAULT CURRENT_DATE
      NOT NULL;
  5. Erstellen einer Domain, die als Array aus 2 Elementen des Typs NUMERIC(18, 3) definiert ist. Der Array-Startindex ist 1.

    CREATE DOMAIN D_POINT AS
      NUMERIC(18, 3) [2];
    Note

    Über einen Array-Typ definierte Domainn können nur zum Definieren von Tabellenspalten verwendet werden.Sie können keine Arraydomänen verwenden, um lokale Variablen in PSQL-Modulen zu definieren.

  6. Erstellen einer Domain, deren Elemente nur Ländercodes sein können, die in der Tabelle COUNTRY definiert sind.

    CREATE DOMAIN D_COUNTRYCODE AS CHAR(3)
      CHECK (EXISTS(SELECT * FROM COUNTRY
             WHERE COUNTRYCODE = VALUE));
    Note

    Das Beispiel wird nur gegeben, um die Möglichkeit zu zeigen, Prädikate mit Abfragen in der Domainntestbedingung zu verwenden.Es wird nicht empfohlen, diesen Domainnstil in der Praxis zu erstellen, es sei denn, die Nachschlagetabelle enthält Daten, die niemals gelöscht werden.

ALTER DOMAIN

Verwendet für

Die aktuellen Attribute einer Domain ändern oder umbenennen

Verfügbar in

DSQL, ESQL

Syntax
ALTER DOMAIN domain_name
  [TO new_name]
  [TYPE <datatype>]
  [{SET DEFAULT {<literal> | NULL | <context_var>} | DROP DEFAULT}]
  [{SET | DROP} NOT NULL]
  [{ADD [CONSTRAINT] CHECK (<dom_condition>) | DROP CONSTRAINT}]

<datatype> ::=
   <scalar_datatype> | <blob_datatype>

<scalar_datatype> ::=
  !! Vgl. Syntax für Skalardatentypen !!

<blob_datatype> ::=
  !! Vgl. Syntax für BLOB-Datentypen !!

!! Siehe auch CREATE DOMAIN-Syntax !!
Table 1. ALTER DOMAIN-Anweisungsparameter
Parameter Beschreibung

new_name

Neuer Name für Domäne.Die maximale Länge beträgt 63 Zeichen

literal

Ein Literalwert, der mit datatype kompatibel ist

context_var

Jede Kontextvariable, deren Typ mit datatype kompatibel ist

Die ALTER DOMAIN-Anweisung ermöglicht Änderungen an den aktuellen Attributen einer Domain, einschließlich ihres Namens.Sie können beliebig viele Domain-Änderungen in einer ALTER DOMAIN-Anweisung vornehmen.

ALTER DOMAIN-Klausel

TO name

Verwenden Sie die TO-Klausel, um die Domain umzubenennen, solange keine Abhängigkeiten von der Domain bestehen, d.h.Tabellenspalten, lokale Variablen oder Prozedurargumente, die darauf verweisen.

SET DEFAULT

Mit der SET DEFAULT-Klausel können Sie einen neuen Standardwert setzen.Wenn die Domain bereits einen Standardwert hat, muss dieser nicht zuerst gelöscht werden – er wird durch den neuen ersetzt.

DROP DEFAULT

Verwenden Sie diese Klausel, um einen zuvor angegebenen Standardwert zu löschen und durch NULL zu ersetzen.

SET NOT NULL

Verwenden Sie diese Klasse, um der Domain eine NOT NULL-Einschränkung hinzuzufügen;Spalten oder Parameter dieser Domain werden daran gehindert, als NULL geschrieben zu werden, d.h. ein Wert ist erforderlich.

Note

Das Hinzufügen einer NOT NULL-Einschränkung zu einer vorhandenen Domain unterzieht alle Spalten, die diese Domain verwenden, einer vollständigen Datenvalidierung. Stellen Sie daher sicher, dass die Spalten keine Nullen enthalten, bevor Sie die Änderung vornehmen.

DROP NOT NULL

Löschen Sie die Einschränkung NOT NULL aus der Domain.

Note

Eine explizite NOT NULL-Einschränkung für eine Spalte, die von einer Domain abhängt, hat Vorrang vor der Domain.In dieser Situation wird die Änderung der Domain, um sie auf NULL zu setzen, nicht an die Spalte weitergegeben.

ADD CONSTRAINT CHECK

Verwenden Sie die ADD CONSTRAINT CHECK-Klausel, um der Domain eine CHECK-Beschränkung hinzuzufügen.Wenn die Domain bereits eine CHECK-Beschränkung hat, muss sie zuerst mit einer ALTER DOMAIN-Anweisung gelöscht werden, die eine DROP CONSTRAINT-Klausel enthält.

TYPE

Die TYPE-Klausel wird verwendet, um den Datentyp der Domain in einen anderen, kompatiblen zu ändern.Das System verbietet jede Änderung des Typs, die zu Datenverlust führen könnte.Ein Beispiel wäre, wenn die Anzahl der Zeichen im neuen Typ kleiner wäre als im bestehenden.

Important

Wenn Sie die Attribute einer Domain ändern, kann vorhandener PSQL-Code ungültig werden.Informationen zur Erkennung finden Sie im Artikel Das RDB$VALID_BLR-Feld in Anhang A.

Was kann ALTER DOMAIN nicht ändern

  • Wenn die Domain als Array deklariert wurde, ist es nicht möglich, ihren Typ oder ihre Dimensionen zu ändern;auch kann kein anderer Typ in einen Array-Typ geändert werden.

  • Es gibt keine Möglichkeit, die Standardsortierung zu ändern, ohne die Domain zu löschen und mit den gewünschten Attributen neu zu erstellen.

Wer kann eine Domain ändern

Die ALTER DOMAIN-Anweisung kann ausgeführt werden durch:

  • Administratoren

  • Der Inhaber der Domain

  • Benutzer mit der Berechtigung ALTER ANY DOMAIN

Domainnänderungen können durch Abhängigkeiten von Objekten verhindert werden, für die der Benutzer nicht über ausreichende Berechtigungen verfügt.

ALTER DOMAIN-Beispiele

  1. Ändern des Datentyps auf INTEGER und Einstellen oder Ändern des Standardwerts auf 2.000:

    ALTER DOMAIN CUSTNO
      TYPE INTEGER
      SET DEFAULT 2000;
  2. Domainnamen ändern

    ALTER DOMAIN D_BOOLEAN TO D_BOOL;
  3. Löschen des Standardwerts und Hinzufügen einer Einschränkung für die Domain:

    ALTER DOMAIN D_DATE
      DROP DEFAULT
      ADD CONSTRAINT CHECK (VALUE >= date '01.01.2000');
  4. Ändern der CHECK-Beschränkung:

    ALTER DOMAIN D_DATE
      DROP CONSTRAINT;
    
    ALTER DOMAIN D_DATE
      ADD CONSTRAINT CHECK
        (VALUE BETWEEN date '01.01.1900' AND date '31.12.2100');
  5. Ändern des Datentyps, um die zulässige Zeichenanzahl zu erhöhen:

    ALTER DOMAIN FIRSTNAME
      TYPE VARCHAR(50) CHARACTER SET UTF8;
  6. Hinzufügen einer NOT NULL-Einschränkung:

    ALTER DOMAIN FIRSTNAME
      SET NOT NULL;
  7. Entfernen einer NOT NULL-Einschränkung:

    ALTER DOMAIN FIRSTNAME
      DROP NOT NULL;

DROP DOMAIN

Verwendet für

Löschen einer bestehenden Domain

Verfügbar in

DSQL, ESQL

Syntax
DROP DOMAIN domain_name

Die DROP DOMAIN-Anweisung löscht eine in der Datenbank vorhandene Domain.Es ist nicht möglich, eine Domain zu löschen, wenn sie von Datenbanktabellenspalten referenziert oder in einem PSQL-Modul verwendet wird.Um eine verwendete Domain zu löschen, müssen alle Spalten in allen Tabellen, die auf die Domain verweisen, gelöscht und alle Verweise auf die Domain aus den PSQL-Modulen entfernt werden.

Wer kann eine Domain löschen

Die DROP DOMAIN-Anweisung kann ausgeführt werden durch:

  • Administratoren

  • Der Inhaber der Domain

  • Benutzer mit dem DROP ANY DOMAIN-Privileg

Example of DROP DOMAIN

Löschen der COUNTRYNAME-Domain
DROP DOMAIN COUNTRYNAME;