{"id":55000609,"date":"2008-06-01T00:00:00","date_gmt":"2020-05-06T15:19:03","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=609"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenbanken_und_Tabellen_per_SQL_anpassen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/","title":{"rendered":"Datenbanken und Tabellen per SQL anpassen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Datenbanken per SQL erstellen Dazu gibt es doch die Access-Benutzeroberfl&auml;che! Das hilft Ihnen aber wenig weiter, wenn Sie eine Anwendung f&uuml;r einen Kunden entwickelt haben und &auml;nderungen am Datenmodell vornehmen m&uuml;ssen, ohne vor Ort zu sein, oder den Kunden fernsteuern m&ouml;chten. Es gibt doch auch noch die Fernwartung Klar, aber wenn die Software nicht nur bei einem, sondern bei vielen Kunden in Betrieb ist &#8230;<\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Am offenen Herzen<\/p>\n<p>Es ist technisch kein Problem, einem Kunden eine neue Version der Benutzeroberfl&auml;che seiner Datenbank zukommen zu lassen, wenn diese sauber vom Backend getrennt ist. Altes Backend wegsichern, neues an die gew&uuml;nschte Stelle kopieren, vielleicht noch automatisiert die Tabellen einbinden, fertig.<\/p>\n<p>Aber was, wenn &auml;nderungen am Datenmodell, also am Backend, notwendig werden Das Backend austauschen Wie denn Dazu m&uuml;sste man zum Beispiel das Backend umbenennen, das neue Backend hinzuf&uuml;gen, die Daten aus dem alten Backend in das neue Backend importieren oder das Backend mit den aktuellen Daten vom Kunden schicken lassen, die &auml;nderungen in Windeseile vornehmen und das Backend wieder zur&uuml;ckschicken. Beides ist keine optimale L&ouml;sung. Viel sch&ouml;ner w&auml;re es doch, wenn man einfach zum Kunden f&auml;hrt und dort von Hand mal eben eine Tabelle hinzuf&uuml;gt, einen Felddatentyp &auml;ndert oder andere Anpassungen durchf&uuml;hrt. Aber wie bereits erw&auml;hnt, macht das auf Dauer keinen Spa&szlig;, wenn Sie vielleicht mehrere Kopien der Software bei weit verstreuten Kunden laufen haben.<\/p>\n<p>Da aber Access jede Aktion, die man mit der Benutzeroberfl&auml;che durchf&uuml;hrt, genau wie Datenabfragen oder -&auml;nderungen auch irgendwie an die Jet Engine kommunizieren muss, scheint es logisch, dass es auch hierf&uuml;r passende SQL-Abfragen gibt. Und genau das ist der Fall: SQL teilt sich in zwei Teile auf, n&auml;mlich in DML (Data Manipulation Language) und DDL (Data Definition Language). DML umfasst die Befehle zum Abfragen und zum &auml;ndern der in den Tabellen enthaltenen Daten und DDL liefert die Anweisungen zum Manipulieren des Datenmodells &#8211; genau genommen k&ouml;nnen Sie damit sogar komplette Datenbanken anlegen (wobei das Anlegen selbst per DAO geschieht).<\/p>\n<h2>Datenbank anlegen<\/h2>\n<p>Sie werden nun zun&auml;chst von einer bestehenden Datenbank aus eine neue Datenbank anlegen (das k&ouml;nnten Sie theoretisch auch in einem VBScript oder von einer anderen Anwendung mit VBA-Entwicklungsumgebung erledigen, aber wir wollen ja kein Ausw&auml;rtsspiel). Dies funktioniert unter Access f&uuml;r JET-Datenbanken nicht wie bei anderen Datenbanksystemen mit der <b>CREATE DATABASE<\/b>-Anweisung, sondern Sie m&uuml;ssen die <b>CreateDatabase<\/b>-Methode des <b>DBEngine<\/b>-Objekts zu Hilfe nehmen:<\/p>\n<pre>DBEngine.CreateDatabase CurrentProject.Path &amp; &quot;\\Suedsturm.mdb&quot;, dbLangGeneral, dbVersion40<\/pre>\n<p>Diese Anweisung legt eine neue Datenbankdatei namens <b>Suedsturm.mdb <\/b>im Verzeichnis der aktuellen Datenbank an und legt mit ihren Optionen fest, dass die Spracheinstellungen f&uuml;r Deutschland und einige weitere L&auml;nder verwendet werden und eine Datenbank f&uuml;r die Verwendung mit Jet 4.0 erzeugt wird. <b>dbLangGeneral <\/b>ist eine Konstante mit dem Inhalt <b>;LANGID=0x0409;CP=1252;COUNTRY=0<\/b>, der Sie beispielsweise noch einen Ausdruck wie <b>pwd=kennwort <\/b>hinzuf&uuml;gen k&ouml;nnen, um ein Kennwort festzulegen. Mit dem Wert <b>dbEncrypt <\/b>k&ouml;nnen Sie die Datenbank zus&auml;tzlich verschl&uuml;sseln.<\/p>\n<h2>Tabellen anlegen<\/h2>\n<p>Tabellen legen wir aber nun per SQL an. Dazu verwenden Sie die <b>CREATE TABLE<\/b>-Anweisung, die den Tabellennamen und zumindest die Angabe eines Felds erwartet (es funktioniert auch ohne Feld, aber diese Tabelle l&auml;sst sich anschlie&szlig;end nicht im Entwurf &ouml;ffnen). Bauen wir eine Tabelle namens <b>tblKategorien <\/b>(siehe Bild 1). Das Grundger&uuml;st erstellt die folgende SQL-Anweisung:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic001_opt.jpeg\" alt=\"pic001.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Tabelle tblKategorien der S&uuml;dsturm-Datenbank<\/span><\/b><\/p>\n<pre>CREATE TABLE tblKategorien(\r\nKategorieID INT,\r\nKategoriename VARCHAR(255),\r\nBeschreibung LONGTEXT,\r\nAbbildung IMAGE)<\/pre>\n<p>Neben dem Tabellennamen geben Sie also die Felder gefolgt vom Datentyp in Klammern in einer durch Kommata getrennten Liste an.<\/p>\n<p>Die Datentypen finden Sie &uuml;brigens in Tab. 1, zusammen mit den jeweils entsprechenden Datentypen f&uuml;r den Tabellenentwurf.<\/p>\n<p>Das Ergebnis ist noch nicht ganz befriedigend: Es fehlen noch die Prim&auml;rschl&uuml;sseleigenschaften des Felds <b>KategorieID<\/b>. Was tun Es gibt zwei M&ouml;glichkeiten: Entweder, Sie l&ouml;schen die Tabelle noch einmal und geben die erforderlichen Informationen beim erneuten Anlegen mit ein, oder Sie reichen die Prim&auml;rschl&uuml;ssel-Eigenschaften so nach.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Tabelle l&ouml;schen<\/p>\n<p>Die erste Variante erfordert zun&auml;chst das L&ouml;schen der Tabelle, die dazu geschlossen sein muss:<\/p>\n<pre>DROP TABLE tblKategorien<\/pre>\n<h2>Prim&auml;rschl&uuml;ssel einrichten<\/h2>\n<p>Anschlie&szlig;end statten Sie die <b>CREATE TABLE<\/b>-Anweisung so aus: <\/p>\n<pre>CREATE TABLE tblKategorien(\r\nKategorieID INT CONSTRAINT PK PRIMARY KEY, ...<\/pre>\n<p>Alternativ f&uuml;gen Sie diesen sogenannten <b>CONSTRAINT<\/b> an das bestehende Feld an, wobei <b>PK <\/b>der Name des dadurch erzeugten Index f&uuml;r das Feld KategorieID ist:<\/p>\n<pre>ALTER TABLE tblKategorien\r\nADD CONSTRAINT PK PRIMARY KEY (KategorieID)<\/pre>\n<h2>Autowert einrichten<\/h2>\n<p>Fehlt noch die Autowert-Eigenschaft. Daf&uuml;r brauchen Sie einfach nur das Schl&uuml;sselwort <b>COUNTER <\/b>statt des Datentyps <b>INT <\/b>anzugeben:<\/p>\n<pre>CREATE TABLE tblKategorien(\r\nKategorieID COUNTER\r\nCONSTRAINT PK PRIMARY KEY, ...<\/pre>\n<h2>Indizes anlegen<\/h2>\n<p>Mit dem <b>CONSTRAINT<\/b>-Schl&uuml;sselwort lassen sich nicht nur Prim&auml;rschl&uuml;ssel, sondern auch sonstige Indexfelder festlegen. Sollte das Feld <b>Kategoriename<\/b> beispielsweise wie in Bild 2 indiziert werden, f&uuml;gt man einen Index wie folgt hinzu:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic002_opt.jpeg\" alt=\"pic002.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Feld mit einem einfachen Index<\/span><\/b><\/p>\n<pre>CREATE INDEX I ON tblKategorien(Kategoriename)<\/pre>\n<p><!--30percent--><\/p>\n<p>Einen einfachen Index k&ouml;nnen Sie nicht direkt beim Anlegen der Tabelle hinzuf&uuml;gen.<\/p>\n<h2>Eindeutige Indizes<\/h2>\n<p>Eine eindeutige Indizierung k&ouml;nnen Sie sowohl beim Anlegen der Tabelle als auch nachtr&auml;glich festlegen. Die Version beim Anlegen sieht so aus:<\/p>\n<pre>CREATE TABLE tblKategorien(...,\r\nKategoriename VARCHAR(255)\r\nCONSTRAINT U UNIQUE, ...)<\/pre>\n<p>Das nachtr&auml;gliche Hinzuf&uuml;gen geschieht so:<\/p>\n<pre>CREATE UNIQUE INDEX U ON tblKategorien(Kategoriename)<\/pre>\n<p>Beide wirken sich wie in Bild 3 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic003_opt.jpeg\" alt=\"pic003.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Ein eindeutiger Index im Indizes-Fenster<\/span><\/b><\/p>\n<h2>Nullwerte verhindern<\/h2>\n<p>Darf ein Feld keine Nullwerte enthalten, f&uuml;gen Sie ihm beim Anlegen die Klausel <b>NOT NULL <\/b>hinzu:<\/p>\n<pre>CREATE TABLE tblKategorien(...,\r\nKategoriename VARCHAR(255) NOT NULL, ...)<\/pre>\n<p>Auf diese Weise stellen Sie die Eigenschaft <b>Eingabe erforderlich <\/b>der Entwurfsansicht auf <b>Ja <\/b>ein.<\/p>\n<h2>Fremdschl&uuml;sselfelder festlegen<\/h2>\n<p>Beziehungen werden in relationalen Datenbanken durch Fremdschl&uuml;sselfelder definiert.<\/p>\n<p>Daher legen Sie nun gleichzeitig eine neue Tabelle namens <b>tblArtikel<\/b> an und f&uuml;gen dieser ein Fremdschl&uuml;sselfeld namens <b>KategorieID <\/b>hinzu, das mit dem Prim&auml;rschl&uuml;sselfeld der Tabelle <b>tblKategorien <\/b>verkn&uuml;pft werden soll:<\/p>\n<pre>CREATE TABLE tblArtikel(\r\nArtikelID COUNTER CONSTRAINT PK PRIMARY KEY,\r\nArtikelname VARCHAR(255) NOT NULL,\r\nKategorieID INT,\r\nCONSTRAINT FK FOREIGN KEY(KategorieID)\r\nREFERENCES tblKategorien)<\/pre>\n<p>Zusammen mit der Tabelle <b>tblKategorien <\/b>ergibt sich das Bild aus Bild 4.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic004_opt.jpeg\" alt=\"pic004.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Beziehung mit aktivierter Aktualisierungs- und L&ouml;schweitergabe<\/span><\/b><\/p>\n<h2>L&ouml;schweitergabe und <\/h2>\n<pre>Aktualisierungsweitergabe aktivieren<\/pre>\n<p>Mit obiger Anweisung legen Sie eine Beziehung mit referentieller Integrit&auml;t an. Zus&auml;tzlich k&ouml;nnen Sie L&ouml;sch- und Aktualisierungsweitergabe wie in Bild 5 definieren. Dies funktioniert, weil es sich um eine JET4-Erweiterung handelt, nur unter ADO:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic005_opt.jpeg\" alt=\"pic005.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Beziehung zwischen zwei Tabellen<\/span><\/b><\/p>\n<pre>Public Sub FremdschluesselfeldMitCascade()\r\nDim cnn As ADODB.Connection\r\nDim strSQL As String\r\nstrSQL = &quot;...&quot;\r\nSet cnn = CurrentProject.Connection\r\ncnn.Execute strSQL\r\nSet cnn = Nothing\r\nEnd Sub<\/pre>\n<p>Die in Klammern befindlichen Punkte stehen f&uuml;r das folgende SQL-Statement:<\/p>\n<pre>CREATE TABLE tblArtikel(\r\nArtikelID COUNTER CONSTRAINT PK PRIMARY KEY,\r\nArtikelname VARCHAR(255) NOT NULL,\r\nKategorieID INT,\r\nCONSTRAINT FK1 FOREIGN KEY(KategorieID)\r\nREFERENCES tblKategorien\r\nON UPDATE CASCADE\r\nON DELETE CASCADE)<\/pre>\n<h2>Zusammengesetzte Prim&auml;rschl&uuml;ssel<\/h2>\n<p>Im eigenen Interesse sollten Sie auf zusammengesetzte Prim&auml;rschl&uuml;ssel verzichten. Eine Tabelle sollte immer einen aus einem einzigen Feld bestehenden Prim&auml;rschl&uuml;ssel besitzen.<\/p>\n<p>Wenn Sie eine Verkn&uuml;pfungstabelle zur Herstellung einer m:n-Beziehung ben&ouml;tigen, dann legen Sie eine Tabelle an, die einen eindeutigen Prim&auml;rschl&uuml;ssel ohne Gesch&auml;ftsdaten besitzt, und erstellen einen weiteren eindeutigen Schl&uuml;ssel &uuml;ber die an der Beziehung beteiligten Fremdschl&uuml;sselfelder.<\/p>\n<h2>Zusammengesetzte eindeutige Schl&uuml;ssel<\/h2>\n<p>Als Beispiel dient die Tabelle <b>tblPositionen<\/b>. Zusammen mit den beiden Tabellen <b>tblBestellungen <\/b>und <b>tblArtikel <\/b>sieht diese im Datenmodell aus wie in Bild 6.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic006_opt.jpeg\" alt=\"pic006.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Tabellen in einer m:n-Beziehung<\/span><\/b><\/p>\n<p>Um dies zu erreichen, ist der Code aus Listing 1 notwendig. Die Routine legt zun&auml;chst die beiden zu verkn&uuml;pfenden Tabellen <b>tblArtikel <\/b>und <b>tblBestellungen <\/b>mit einigen Beispielfeldern und dann die Verkn&uuml;pfungstabelle <b>tblPositionen <\/b>mit den beiden Fremdschl&uuml;sseln an.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Diese Routine erstellt drei per m:n-Beziehung verkn&uuml;pfte Tabellen.<\/p>\n<pre>Public Sub mnBeziehung()\r\nDim cnn As ADODB.Connection\r\nSet cnn = CurrentProject.Connection\r\ncnn.Execute &quot;CREATE TABLE tblArtikel(ArtikelID COUNTER CONSTRAINT PK PRIMARY KEY, &quot; _\r\n&amp; &quot;Artikelname VARCHAR(255) NOT NULL, KategorieID INT, CONSTRAINT FK1 FOREIGN &quot; _\r\n&amp; &quot;KEY(KategorieID) REFERENCES tblKategorien ON UPDATE CASCADE ON DELETE CASCADE)&quot;\r\ncnn.Execute &quot;CREATE TABLE tblBestellungen(BestellungID COUNTER CONSTRAINT PK PRIMARY KEY, &quot; _\r\n&amp; &quot;KundeID INT, Bestelldatum DATETIME, Lieferdatum DATETIME)&quot;\r\ncnn.Execute &quot;CREATE TABLE tblPositionen(PositionID COUNTER CONSTRAINT PK PRIMARY KEY, &quot; _\r\n&amp; &quot;ArtikelID INT, BestellungID INT, &quot; _\r\n&amp; &quot;CONSTRAINT FKArtikel FOREIGN KEY(ArtikelID) REFERENCES tblArtikel, &quot; _\r\n&amp; &quot;CONSTRAINT FKBestellungen FOREIGN KEY(BestellungID) REFERENCES tblBestellungen, &quot; _\r\n&amp; &quot;CONSTRAINT UK UNIQUE(ArtikelID, BestellungID))&quot;\r\nSet cnn = Nothing\r\nEnd Sub<\/pre>\n<p>Interessant ist hier die letzte <b>CONSTRAINT<\/b>-Anweisung: Sie legt den zusammengesetzten eindeutigen Index an, den Sie in Bild 7 erkennen k&ouml;nnen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic007_opt.jpeg\" alt=\"pic007.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Zusammengesetzter eindeutiger Schl&uuml;ssel<\/span><\/b><\/p>\n<h2>Feld zu einer Tabelle hinzuf&uuml;gen<\/h2>\n<p>&auml;nderungen an Tabellen erledigt man mit der <b>ALTER<\/b>-Anweisung gefolgt vom Tabellennamen und den gew&uuml;nschten &auml;nderungen.<\/p>\n<p>Um der Tabelle <b>tblPositionen <\/b>ein W&auml;hrungsfeld namens Einzelpreis hinzuzuf&uuml;gen, verwenden Sie beispielsweise die folgende SQL-Anweisung:<\/p>\n<pre>ALTER TABLE tblPositionen\r\nADD COLUMN Einzelpreis MONEY<\/pre>\n<p>Weitere Eigenschaften geben Sie wie beim Anlegen von Feldern innerhalb einer <b>CREATE TABLE<\/b>-Anweisung an, also zum Beispiel so:<\/p>\n<pre>ALTER TABLE tblPositionen ADD COLUMN Einzelpreis MONEY NOT NULL CONSTRAINT U UNIQUE<\/pre>\n<h2>Feld l&ouml;schen<\/h2>\n<p>Felder l&ouml;schen Sie innerhalb einer <b>ALTER TABLE<\/b>-Anweisung mit dem Schl&uuml;sselwort <b>DROP COLUMN<\/b>:<\/p>\n<pre>ALTER TABLE tblPositionen\r\nDROP COLUMN Einzelpreis<\/pre>\n<h2>Feld &auml;ndern<\/h2>\n<p>Auf diese Weise k&ouml;nnen Sie auch bestehende Felder &auml;ndern. Wenn Sie den im vorigen Beispiel angelegten eindeutigen Index wieder entfernen m&ouml;chten, verwenden Sie die folgende Anweisung:<\/p>\n<pre>ALTER TABLE tblPositionen DROP CONSTRAINT U<\/pre>\n<p>Wenn Sie einfach nur den Datentyp &auml;ndern m&ouml;chten, setzen Sie diese Anweisung ein:<\/p>\n<pre>ALTER TABLE tblPositionen\r\nALTER COLUMN Einzelpreis REAL<\/pre>\n<p>Schwieriger wird es, wenn Sie den Namen &auml;ndern m&ouml;chten. Dazu m&uuml;ssen Sie das Feld l&ouml;schen und dann neu anlegen. Prinzipiell kein Problem, aber wenn das zu &auml;ndernde Feld schon Daten enth&auml;lt, m&uuml;ssen Sie diese zwischendurch umkopieren.<\/p>\n<p>Im Detail kann das wie folgt aussehen:<\/p>\n<pre>Public Sub FeldnameAendern()\r\nDim db As DAO.Database\r\nSet db = CurrentDb\r\ndb.Execute &quot;ALTER TABLE tblPositionen &quot; _\r\n&amp; &quot;ADD COLUMN Preis MONEY&quot;\r\ndb.Execute &quot;UPDATE tblPositionen &quot; _\r\n&amp; &quot;SET Preis = Einzelpreis&quot;\r\ndb.Execute &quot;ALTER TABLE tblPositionen &quot; _\r\n&amp; &quot;DROP COLUMN Einzelpreis&quot;\r\nEnd Sub<\/pre>\n<h2>Index l&ouml;schen<\/h2>\n<p>Fehlt noch das L&ouml;schen eines Index. Dies erledigen Sie mit der <b>DROP INDEX<\/b>-Anweisung, die einen Index namens <b>PK<\/b> aus der Tabelle <b>tblPositionen <\/b>entfernt:<\/p>\n<pre>DROP INDEX PK ON tblPositionen<\/pre>\n<h2>Standardwerte festlegen<\/h2>\n<p>Das Festlegen eines Standardwerts f&uuml;r ein Feld ist ebenfalls m&ouml;glich. Allerdings handelt es sich hierbei um eine JET4-Erweiterung, die nur im Rahmen einer ADODB-Connection verwendet werden kann:<\/p>\n<pre>CREATE TABLE tblStandardwert(\r\nID COUNTER CONSTRAINT PK PRIMARY KEY,\r\nTextfeldMitStandardwert VARCHAR(255)\r\nDEFAULT &apos;Dies ist ein Standardwert&apos;<\/pre>\n<p>Wenn der Standardwert keine Leerzeichen enth&auml;lt, k&ouml;nnen Sie ihn auch ohne Hochkommata angeben. Bild 8 zeigt den Standardwert in der Entwurfsansicht der Tabelle.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/DDLMitSQL-web-images\/pic008_opt.jpeg\" alt=\"pic008.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Standardwert in der Entwurfsansicht<\/span><\/b><\/p>\n<h2>Daten weitergeben<\/h2>\n<p>Wer mit den DDL-Befehlen von SQL das Datenmodell einer Anwendung anpasst, m&ouml;chte gegebenenfalls auch die eine oder andere Tabelle per Code f&uuml;llen &#8211; interessant w&auml;re dies vor allem f&uuml;r Lookup-Tabellen wie etwa eine Tabelle zum Speichern von Anreden.<\/p>\n<p>Eine solche Tabelle erstellen Sie mit der folgenden Routine und legen dazu noch einige Datens&auml;tze an:<\/p>\n<pre>Public Sub Anredetabelle()\r\nDim db As DAO.Database\r\nSet db = CurrentDb\r\ndb.Execute &quot;CREATE TABLE tblAnreden(&quot; _\r\n&amp; &quot;AnredeID COUNTER CONSTRAINT PK &quot; _\r\n&amp; &quot;PRIMARY KEY, Anrede VARCHAR(255))&quot;\r\ndb.Execute &quot;INSERT INTO tblAnreden(Anrede)&quot; _\r\n&amp; &quot; VALUES(&apos;Herr&apos;);&quot;\r\ndb.Execute &quot;INSERT INTO tblAnreden(Anrede)&quot; _\r\n&amp; &quot; VALUES(&apos;Frau&apos;);&quot;\r\nEnd Sub<\/pre>\n<h2>Access-Besonderheiten<\/h2>\n<p>Vielleicht m&ouml;chten Sie auch noch eine der Access-Spezialit&auml;ten einsetzen &#8211; zum Beispiel in Form von G&uuml;ltigkeitsregel\/-meldung oder einem Nachschlagefeld f&uuml;r ein Fremdschl&uuml;sselfeld<\/p>\n<p>Dies funktioniert leider nicht per SQL\/DDL, sondern erfordert den Einsatz von DAO. Mit der folgenden Routine lernen Sie alle Eigenschaften von Tabellen und Feldern der im Parameter angegebenen Tabelle kennen:<\/p>\n<pre>Public Sub TabellenUndFeldeigenschaften( _\r\nstrTable as string)\r\nDim db As DAO.Database\r\nDim tdf As DAO.TableDef\r\nDim prp As DAO.Property\r\nDim fld As DAO.Field\r\nSet db = CurrentDb\r\nSet tdf = db.TableDefs(strTable)\r\nOn Error Resume Next\r\nFor Each prp In tdf.Properties\r\nDebug.Print prp.Name, prp.Value\r\nNext prp\r\nFor Each fld In tdf.Fields\r\nDebug.Print fld.Name\r\nFor Each prp In fld.Properties\r\nDebug.Print &quot; &quot; &amp; prp.Name, _\r\nprp.Value\r\nNext prp\r\nNext fld\r\nEnd Sub<\/pre>\n<p>Dort erfahren Sie zum Beispiel, dass es Eigenschaften namens <b>ValidationRule <\/b>und <b>ValidationText <\/b>gibt. Mit der folgenden Routine stellen Sie diese Eigenschaften ein:<\/p>\n<pre>Public Sub GueltigkeitsregelSetzen()\r\nDim db As DAO.Database\r\nDim tdf As DAO.TableDef\r\nDim fld As DAO.Field\r\nSet db = CurrentDb\r\nSet tdf = db.TableDefs(&quot;tblArtikel&quot;)\r\nSet fld = tdf.Fields(&quot;Einzelpreis&quot;)\r\nfld.Properties(&quot;ValidationRule&quot;) = &quot;&gt;=0&quot;\r\nfld.Properties(&quot;ValidationText&quot;) = _\r\n&amp; &quot;Bitte geben Sie einen positiven &quot; _\r\n&amp; &quot;Wert ein.&quot;\r\nEnd Sub<\/pre>\n<p>Auf die gleiche Weise k&ouml;nnen Sie auch die anderen Eigenschaften anpassen, um etwa ein Nachschlagefeld einzurichten.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag liefert die Grundlagen f&uuml;r die automatisierte Anpassung des Datenmodells. In einem weiteren Beitrag erfahren Sie, wie Sie das Datenmodell einer bestehenden Anwendung anpassen und wie Sie ermitteln, welche Elemente der Anwendung ge&auml;ndert werden m&uuml;ssen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Datenbanken per SQL erstellen Dazu gibt es doch die Access-Benutzeroberfl&auml;che! Das hilft Ihnen aber wenig weiter, wenn Sie eine Anwendung f&uuml;r einen Kunden entwickelt haben und &Auml;nderungen am Datenmodell vornehmen m&uuml;ssen, ohne vor Ort zu sein, oder den Kunden fernsteuern m&ouml;chten. Es gibt doch auch noch die Fernwartung Klar, aber wenn die Software nicht nur bei einem, sondern bei vielen Kunden in Betrieb ist &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662008,66032008,44000022,44000021],"tags":[],"class_list":["post-55000609","post","type-post","status-publish","format-standard","hentry","category-662008","category-66032008","category-SQL_Server_und_Co","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Datenbanken und Tabellen per SQL anpassen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenbanken und Tabellen per SQL anpassen\" \/>\n<meta property=\"og:description\" content=\"Datenbanken per SQL erstellen Dazu gibt es doch die Access-Benutzeroberfl&auml;che! Das hilft Ihnen aber wenig weiter, wenn Sie eine Anwendung f&uuml;r einen Kunden entwickelt haben und &Auml;nderungen am Datenmodell vornehmen m&uuml;ssen, ohne vor Ort zu sein, oder den Kunden fernsteuern m&ouml;chten. Es gibt doch auch noch die Fernwartung Klar, aber wenn die Software nicht nur bei einem, sondern bei vielen Kunden in Betrieb ist ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:19:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenbanken und Tabellen per SQL anpassen\",\"datePublished\":\"2020-05-06T15:19:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/\"},\"wordCount\":1778,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/80feb2aeee7e4050a469cd6ff09762c2\",\"articleSection\":[\"2008\",\"3\\\/2008\",\"SQL Server und Co.\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/\",\"name\":\"Datenbanken und Tabellen per SQL anpassen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/80feb2aeee7e4050a469cd6ff09762c2\",\"datePublished\":\"2020-05-06T15:19:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/80feb2aeee7e4050a469cd6ff09762c2\",\"contentUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/80feb2aeee7e4050a469cd6ff09762c2\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbanken_und_Tabellen_per_SQL_anpassen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenbanken und Tabellen per SQL anpassen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Datenbanken und Tabellen per SQL anpassen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/","og_locale":"de_DE","og_type":"article","og_title":"Datenbanken und Tabellen per SQL anpassen","og_description":"Datenbanken per SQL erstellen Dazu gibt es doch die Access-Benutzeroberfl&auml;che! Das hilft Ihnen aber wenig weiter, wenn Sie eine Anwendung f&uuml;r einen Kunden entwickelt haben und &Auml;nderungen am Datenmodell vornehmen m&uuml;ssen, ohne vor Ort zu sein, oder den Kunden fernsteuern m&ouml;chten. Es gibt doch auch noch die Fernwartung Klar, aber wenn die Software nicht nur bei einem, sondern bei vielen Kunden in Betrieb ist ...","og_url":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:19:03+00:00","og_image":[{"url":"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenbanken und Tabellen per SQL anpassen","datePublished":"2020-05-06T15:19:03+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/"},"wordCount":1778,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2","articleSection":["2008","3\/2008","SQL Server und Co.","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/","url":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/","name":"Datenbanken und Tabellen per SQL anpassen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2","datePublished":"2020-05-06T15:19:03+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#primaryimage","url":"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2","contentUrl":"http:\/\/vg03.met.vgwort.de\/na\/80feb2aeee7e4050a469cd6ff09762c2"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenbanken_und_Tabellen_per_SQL_anpassen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenbanken und Tabellen per SQL anpassen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000609"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000609\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}