Domains und Co. definieren

Domains sind vor allem bei der Migration von Oracle Datenstrukturen wichtig. Im Prinzip ermöglicht CREATE DOMAIN die Definition von sogenannten Aliasen:

test=# \h CREATE DOMAIN
Command:     CREATE DOMAIN
Description: define a new domain
Syntax:
CREATE DOMAIN name [AS] data_type
    [ DEFAULT expression ]
    [ constraint [ ... ] ]

where constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression) }

Damit wird es möglich, neue Namen für Datentypen zu vergeben. Im Fall von Oracle Migrationen könnte man CREATE DOMAIN beispielsweise wie folgt nutzen:

test=# CREATE DOMAIN varchar2 AS text;
CREATE DOMAIN

Es ist nun bereits möglich, eine Tabelle zu erzeugen, die den 'neuen' Datentypen enthält:

test=# CREATE TABLE t_name (id int4, name varchar2);
CREATE TABLE

Um eine Domain wieder loszuwerden, können Sie DROP DOMAIN verwenden:

test=# \h DROP DOMAIN
Command:     DROP DOMAIN
Description: remove a domain
Syntax:
DROP DOMAIN [ IF EXISTS ] name [, ...]  [ CASCADE | RESTRICT ]

In unserem Fall ist es nicht möglich, die Domain direkt zu löschen, da es noch eine Tabelle gibt, die einen entsprechenden Datentypen enthält:

test=# DROP DOMAIN varchar2;
NOTICE:  table t_name column name depends on type varchar2
ERROR:  cannot drop type varchar2 because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

Wie der kleine Hinweis bereits erahnen lässt, kann eine Domain in diesem Fall nur dann eliminiert werden, wenn wir CASCADE verwenden:

test=# DROP DOMAIN varchar2 CASCADE;
NOTICE:  drop cascades to table t_name column name
DROP DOMAIN

Die Tabelle selbst wird in diesem Fall nicht gelöscht - PostgreSQL entfernt allerdings die entsprechenden Spalten aus der zugrunde liegenden Tabelle:

test=# SELECT * FROM t_name;
 id
----
(0 rows)

test=# \d t_name
    Table "public.t_name"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer |

In unserem Fall bleibt somit genau eine Spalte erhalten.

CREATE DOMAIN ermöglicht es, einen Datentypen mit einem CHECK-Constraint zu versehen. Die Frage, die sich stellt ist: Wie kann man vom CHECK-Constraint aus auf den zu prüfenden Wert verweisen? Das folgende Beispiel zeigt die Lösung:

test=# CREATE DOMAIN waehrung AS numeric(8, 2) CHECK (VALUE > 0);
CREATE DOMAIN

Wir legen einen Datentyp an, der zum Abspeichern einer Währung dienen soll. Innerhalb des CHECK-Constraints können wir das Schlüsselwort VALUE verwenden, um auf den zu prüfenden Wert zu verweisen.


Cybertec Schönig & Schönig GmbH
PostgreSQL support, training, consulting
www.postgresql-support.de