Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Definition (DDL) → DOMAIN
Firebird Home Firebird Home Zurück: SHADOWFirebird Documentation IndexNach oben: Statements der Data Definition (DDL)Weiter: TABLE

DOMAIN

Inhaltsverzeichnis

CREATE DOMAIN
ALTER DOMAIN
DROP DOMAIN

Domain ist eine Objektart innerhalb einer relationalen Datenbank. Eine Domain wird als ein bestimmter Datentyp mit einigen Attributen erstellt. Sobald es in der Datenbank definiert wurde, kann es wiederholt verwendet werden, um Tabellenspalten, PSQL-Argumente und lokale PSQL-Variablen zu definieren. Diese Objekte erben alle Attribute der Domain Einige Attribute können bei Bedarf überschrieben werden, wenn das neue Objekt definiert ist.

In diesem Abschnitt wird die Syntax von Anweisungen beschrieben, mit denen Domains erstellt, geändert und gelöscht werden. Eine detaillierte Beschreibung von Domains und deren Verwendung finden Sie in Benutzerdefinierte Datentypen — Domains.

CREATE DOMAIN

Benutzt 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> ::=
    {SMALLINT | INTEGER | BIGINT} [<array_dim>]
  | {FLOAT | DOUBLE PRECISION} [<array_dim>]
  | {DATE | TIME | TIMESTAMP} [<array_dim>]
  | {DECIMAL | NUMERIC} [(precision [, scale])] [<array_dim>]
  | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
    [<array_dim>] [CHARACTER SET charset_name]
  | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING]
    [(size)] [<array_dim>]
  | BLOB [SUB_TYPE {subtype_num | subtype_name}]
    [SEGMENT SIZE seglen] [CHARACTER SET charset_name]
  | BLOB [(seglen [, subtype_num])]

<array_dim> ::= [[m:]n [,[m:]n ...]]

<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 <datatype>)
  | (<select_one>)
  | func([<val> [, <val> ...]])
        

Tabelle 5.5. CREATE DOMAIN Statement-Parameter

Parameter Beschreibung
name Domainname aus maximal 31 Zeichen
datatype SQL-Datentyp
literal Ein literaler Wert, der kompatibel zu datatype ist
context_var Jede Kontextvariable, deren Typ kompatibel ist mit datatype
dom_condition Domain-Bedingung
collation_name Name einer Collation, die für charset_name gültig ist, sofern dieser mit datatype übergeben wird, oder andernfalls für den Standardzeichensatz der Datenbank
array_dim Array-Dimensionen
m, n INTEGER-Ganzzahlen, die den Indexbereich der Array-Dimensionen angeben
precision Die Gesamtzahl der signifikanten Ziffern, die ein Wert von datatype aufnehmen kann (1..18)
scale Die Anzahl der Stellen nach dem Dezimalpunkt (0..precision)
size Die maximale Anzahl einer Zeichenkette in Zeichen
charset_name Der Name eines gültigen Zeichensatzes, falls sich der Zeichensatz der Domain vom Standardzeichensatz der Datenbank unterscheidet
subtype_num BLOB Subtype-Nummer
subtype_name BLOB-Subtyp-Mnemonikname
seglen Segmentgröße (max. 65535)
select_one Eine skalare SELECT-Anweisung — Auswählen einer Spalte und Zurückgeben nur eines row
select_list Eine SELECT-Anweisung, die eine Spalte auswählt und null oder mehr Zeilen zurückgibt
select_expr Eine SELECT-Anweisung, die eine Spalte oder mehrere Spalten auswählt und null oder mehr Zeilen zurückgibt
expression Ein Ausdruck, der auf einen Wert auflöst, der mit datatype kompatibel ist
genname Sequenzname (Generatorname)
func Interne Funktion oder UDF


Die Anweisung CREATE DOMAIN erstellt eine neue Domain.

Jeder SQL-Datentyp kann als Domainntyp angegeben werden.

Typenspezifische Details

ARRAY Typen: 

  • Wenn die Domain ein Array sein soll, kann der Basistyp ein SQL-Datentyp mit Ausnahme von BLOB und ARRAY sein.
  • Die Dimensionen des Arrays werden in eckigen Klammern angegeben. (Im Syntaxblock werden diese Klammern fett dargestellt, 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:
    • Standardmäßig sind Arrays 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 optional ein Leerraum, der zweite ist größer als der 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 ein optionales Leerzeichen getrennt werden.
  • Indizes werden nur validiert, wenn ein Array tatsächlich existiert. Dies bedeutet, dass keine Fehlermeldungen bezüglich ungültiger Subskripte zurückgegeben werden, wenn ein bestimmtes Element nichts zurückgibt oder wenn ein Array-Feld NULL ist.

CHARACTER Typen: Sie können die CHARACTER SET-Klausel nutzen, um den Zeichensatz für die Datentypen CHAR, VARCHAR und BLOB (SUB_TYPE TEXT) zu definieren. Wird der Zeichensatz nicht angegeben, wird der in der Datenbank als DEFAULT CHARACTER SET Zeichensatz verwendet. Ist auch dieser nicht festgelegt, wird der Zeichensatz NONE als Standard für die Anlage von Domains verwendet.

Warnung

Bei Zeichensatz NONE werden Zeichendaten gespeichert und abgerufen, wie sie übermittelt wurden. Daten in einer beliebigen Codierung können zu einer Spalte auf der Grundlage einer solchen Domain hinzugefügt werden. Es ist jedoch nicht möglich, diese Daten zu einer Spalte mit einer anderen Codierung hinzuzufügen. Da zwischen Quell- und Zielcodierung keine Transkription 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 Anweisung INSERT ausgeführt wird, wenn in der DML-Anweisung kein Wert dafür 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 basierend auf einer Domain mit der NOT NULL-Beschränkung werden daran gehindert, als NULL geschrieben zu werden, d.h. ein Wert ist erforderlich.

Achtung

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

CHECK-Constraint(s)Die optionale Klausel CHECK gibt Einschränkungen für die Domain an. Eine Domainnbeschrä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“ (entspricht NULL) zurückgibt. Wenn das Prädikat FALSE zurückgibt, ist die Bedingung für die Annahme nicht erfüllt.

VALUE-Schlüsselwort: Das Schlüsselwort VALUE in einer Domainbeschränkung ersetzt die Tabellenspalte, die auf dieser Domain oder einer Variablen in einem PSQL-Modul basiert. Es enthält den Wert, der der Variablen oder der Tabellenspalte zugewiesen ist. 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 Sortierreihenfolge (Collation) angeben, wenn die Domain auf einem der String-Datentypen basiert, einschließlich BLOBs mit Textsubtypen. Wenn keine Sortierreihenfolge angegeben ist, ist die Sortierreihenfolge diejenige, die für den angegebenen Zeichensatz zum Zeitpunkt der Erstellung der Domain voreingestellt ist.

Jeder Benutzer, der mit der Datenbank verbunden ist, kann eine Domain erstellen.

Beispiele für CREATE DOMAIN

  1. Erstellen einer Domain mit Werten von mehr als 1.000 und einem Standardwert von 10.000.
    CREATE DOMAIN CUSTNO AS
    INTEGER DEFAULT 10000
    CHECK (VALUE > 1000);
                
  2. Erstellen einer Domain, die die Werte "Ja" und "Nein" in dem Standardzeichensatz annehmen kann, der während der Erstellung der Datenbank angegeben wurde.
    CREATE DOMAIN D_BOOLEAN AS
    CHAR(3) CHECK (VALUE IN ('Yes', 'No'));
                
  3. Erstellen einer Domain mit dem Zeichensatz UTF8 und der Sortierreihenfolge (Collation) 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 ein Array aus zwei Elementen des Typs NUMERIC(18, 3) definiert ist. Der Start-Array-Index ist 1.
    CREATE DOMAIN D_POINT AS
    NUMERIC(18, 3) [2];
                

    Anmerkung

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

  6. Erstellen einer Domain, deren Elemente nur in der Tabelle COUNTRY definierte Ländercodes sein können.
    CREATE DOMAIN D_COUNTRYCODE AS CHAR(3)
    CHECK (EXISTS(SELECT * FROM COUNTRY
           WHERE COUNTRYCODE = VALUE));
                

    Anmerkung

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

Siehe auch: ALTER DOMAIN, DROP DOMAIN

ALTER DOMAIN

Benutzt 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]
  [ADD [CONSTRAINT] CHECK (<dom_condition>) | DROP CONSTRAINT]

<datatype> ::=
    {SMALLINT | INTEGER | BIGINT}
  | {FLOAT | DOUBLE PRECISION}
  | {DATE | TIME | TIMESTAMP}
  | {DECIMAL | NUMERIC} [(precision [, scale])]
  | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
    [CHARACTER SET charset_name]
  | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(size)]
  | BLOB [SUB_TYPE {subtype_num | subtype_name}]
    [SEGMENT SIZE seglen] [CHARACTER SET charset_name]
  | BLOB [(seglen [, subtype_num])]

<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 <datatype>)
  | (<select_one>)
  | func([<val> [, <val> ...]])
        

Tabelle 5.6. ALTER DOMAIN Statement-Parameter

Parameter Beschreibung
new_name Neuer Domainname, bestehend aus maximal 31 Zeichen
datatype SQL-Datentyp
literal Ein literaler Wert, der kompatibel zu datatype ist
context_var Jede Kontextvariable, deren Typ kompatibel ist mit datatype
precision Die Gesamtzahl der signifikanten Ziffern, die ein Wert des Datentyps aufnehmen kann (1..18)
scale Die Anzahl der Stellen nach dem Dezimalkomma (0..precision)
size Die maximale Größe einer Zeichenkette in Zeichen
charset_name Der Name eines gültigen Zeichensatzes, falls sich der Zeichensatz der Domain vom Standardzeichensatz der Datenbank unterscheidet
subtype_num BLOB Subtype-Nummer
subtype_name BLOB-Subtyp-Mnemonikname
seglen Segmentgröße (max. 65535)
select_one Eine skalare SELECT-Anweisung — Auswählen einer Spalte und Zurückgeben nur eines row
select_list Eine SELECT-Anweisung, die eine Spalte auswählt und null oder mehr Zeilen zurückgibt
select_expr Eine SELECT-Anweisung, die eine Spalte oder mehrere Spalten auswählt und null oder mehr Zeilen zurückgibt
expression Ein Ausdruck, der auf einen Wert auflöst, der mit datatype kompatibel ist
genname Sequenzname (Generatorname)
func Interne Funktion oder UDF


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

TO <name>:  Verwenden Sie die TO-Klausel, um die Domain umzubenennen, solange keine Abhängigkeiten von der Domain vorhanden sind, z. B. 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 sie nicht zuerst gelöscht werden, sondern wird durch die neue ersetzt.

DROP DEFAULT: Mit dieser Klausel löschen Sie einen zuvor festgelegten Standardwert und ersetzen ihn durch NULL.

ADD CONSTRAINT CHECK: Verwenden Sie die Klausel ADD CONSTRAINT CHECK, um einen CHECK-Constraint zur Domain hinzuzufügen. Existiert bereits ein CHECK-Constraint für die Domain, muss dieser zunächst gelöscht werden. Nutzen Sie dazu ein ALTER DOMAIN-Statement, das eine DROP CONSTRAINT-Klausel beinhaltet.

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

Wichtig

Wenn Sie die Attribute einer Domain ändern, kann der vorhandene PSQL-Code ungültig werden. Für Informationen zur Erkennung lesen Sie bitte den Artikel Das RDB$VALID_BLR Feld in Anhang A.

Jeder Benutzer, der mit der Datenbank verbunden ist, kann eine Domain ändern, sofern sie nicht durch Abhängigkeiten von Objekten verhindert wird, für die dieser Benutzer nicht über ausreichende Berechtigungen verfügt.

Was die Ausführung von ALTER DOMAIN verhindert

  • Wenn die Domain als ein Array deklariert wurde, ist es nicht möglich, ihren Typ oder ihre Dimensionen zu ändern. Es kann auch kein anderer Typ in einen ARRAY-Typ geändert werden.
  • In Firebird 2.5 und niedriger darf die Einschränkung NOT NULL weder für eine Domain aktiviert noch deaktiviert werden.
  • Es gibt keine Möglichkeit, die Standardkollation zu ändern, ohne die Domain zu löschen und sie mit den gewünschten Attributen neu zu erstellen.

Beispiele für ALTER DOMAIN

  1. Ändern des Datentyps in INTEGER und festlegen oder ändern des Standardwerts auf 2.000:
    ALTER DOMAIN CUSTNO
      TYPE INTEGER
      SET DEFAULT 2000;
                
  2. Umbenennen einer Domain.
    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 des CHECK-Constraints:
    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 Anzahl von Zeichen zu erhöhen:
    ALTER DOMAIN FIRSTNAME
      TYPE VARCHAR(50) CHARACTER SET UTF8;
                

Siehe auch: CREATE DOMAIN, DROP DOMAIN

DROP DOMAIN

Benutzt für: Eine bestehende Domain löschen

Verfügbar in: DSQL, ESQL

Syntax: 

DROP DOMAIN domain_name
        

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

Jeder Benutzer, der mit der Datenbank verbunden ist, kann eine Domain löschen.

Beispiele

Löschen der COUNTRYNAME-Domain:

DROP DOMAIN COUNTRYNAME;
          

Siehe auch:  CREATE DOMAIN, ALTER DOMAIN

Zurück: SHADOWFirebird Documentation IndexNach oben: Statements der Data Definition (DDL)Weiter: TABLE
Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Definition (DDL) → DOMAIN