[SQL / Access 2003] Probleem met CONSTRAINT.

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

  • Malebolgia
  • Registratie: Februari 2002
  • Laatst online: 22-01 23:59

Malebolgia

Move, or be moved

Topicstarter
Ben nu bezig om mbv een ASP-pagina via SQL een Access-2003 database te definiëren. Lukt allemaal goed, behalve het via SQL afdwingen van referentiële integriteit via de CONSTRAINT clausule.

de CREATE TABLE query ziet er als volgt uit:
ASP:
1
2
3
4
5
6
7
8
9
10
"CREATE TABLE Metaveld (" & _
"Veld_ID COUNTER NOT NULL UNIQUE," & _
"Veld_Naam CHAR(50) NOT NULL," & _ 
"Tabel Int," & _
"Datatype CHAR(50)," & _
"Verwijst Int," & _
"CONSTRAINT PK_Veld_ID PRIMARY KEY (Veld_ID), " &_
"CONSTRAINT FK_Tabel FOREIGN KEY (Tabel) REFERENCES Metatabel, " & _
"CONSTRAINT FK_Datatype FOREIGN KEY (Datatype) REFERENCES Metadatatype ON UPDATE CASCADE, " & _
"CONSTRAINT FK_Verwijst FOREIGN KEY (Verwijst) REFERENCES MetaVeld);"

zonder "ON UPDATE CASCADE" (regel 9) werkt ie prima (alle naamgeving / datatypes etc kloppen). Als ik via Access-->Relaties dezelfde referentiele integriteit wil instellen werkt het ook prima.

Maar als ik bovenstaande code gebruik krijg ik de volgende error terug:
"[Microsoft][ODBC Microsoft Access Driver] Syntax error in CONSTRAINT clause."

Deze error krijg ik ook als ik direct via een query in Access dezelfde bewerking uitvoer. Zelfs als ik de SQL-voorbeelden mbt CONSTRAINT uit de help van Access toepas via het uitvoeren van een query krijg ik dezelfde error. Heeft iemand een idee hoe ik dit kan verhelpen / wat ik verkeerd doe? Of zijn er andere manieren om via ASP mbv ADO(X)/SQL die referentiële integriteit af te dwingen?

"People should know when they're conquered..."


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Weet je zeker dat Access cascading updates ondersteunt? Dat moet dan een nieuwe featue van de 2003 versie zijn.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Malebolgia
  • Registratie: Februari 2002
  • Laatst online: 22-01 23:59

Malebolgia

Move, or be moved

Topicstarter
naar aanleiding van deze optie bij het bewerken van relaties was ik daar wel vanuit gegaan ja:
Afbeeldingslocatie: http://www.kidsgear.nl/on_update_cascade.gif

of wordt dit niet op database-niveau maar op applicatie-niveau in Access ondersteunt?

"People should know when they're conquered..."


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je hebt gelijk.

Ik vond de volgende quote:
The Jet database engine will cascade update if the relationships between tables are configured to enable this option. While Jet SQL gives us a mechanism to establish a relationship (using the CONSTRAINT clause) it does not give us any method to configure relationships to enable cascading operations. However, if a relationship has been configured to enable cascading operations, for example by using Microsoft Access or DAO (Data Access Objects) , the Jet SQL UPDATE and DELETE) statements will cascade.
Het lijkt er dus op dat het niet via een SQL Statement kan. Maar toen las ik het volgende:
You can specify actions to be performed on the foreign table based on a corresponding action performed on a primary key in the table on which the CONSTRAINT is defined. For example, consider the following definition for the table Customers:

CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))

Consider the following definition of the table Orders, which defines a foreign key relationship referencing the primary key of the Customers table:

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
Hier op de MS site staat dat het moet kunnen, maar jij krijgt een syntax error. Ik denk dat het komt omdat je de 'oude' Access ODBC driver gebruikt. Probeer de volgende connectiestring eens:

code:
1
provider=Microsoft.jet.OLEDB.4.0;Data Source=C:\database.mdb


Ik gok erop dat deze wel werkt. Werkt het alsnog niet, dan zou je blijkbaar met ADOX nog wat kunnen doen. Je kunt van een ActiveConnection.Table.Key object de DeleteRule/Update rule op adRlCascase zetten om de cascading update aan te zetten

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Malebolgia
  • Registratie: Februari 2002
  • Laatst online: 22-01 23:59

Malebolgia

Move, or be moved

Topicstarter
P_de_B schreef op vrijdag 08 juli 2005 @ 20:37:
Je hebt gelijk.

Ik vond de volgende quote:

[...]


Het lijkt er dus op dat het niet via een SQL Statement kan. Maar toen las ik het volgende:


[...]

Hier op de MS site staat dat het moet kunnen, maar jij krijgt een syntax error. Ik denk dat het komt omdat je de 'oude' Access ODBC driver gebruikt. Probeer de volgende connectiestring eens:

code:
1
provider=Microsoft.jet.OLEDB.4.0;Data Source=C:\database.mdb


Ik gok erop dat deze wel werkt. Werkt het alsnog niet, dan zou je blijkbaar met ADOX nog wat kunnen doen. Je kunt van een ActiveConnection.Table.Key object de DeleteRule/Update rule op adRlCascase zetten om de cascading update aan te zetten
Bedankt voor je zoekwerk! Ben zelf ook een halve dag bezig geweest maar zocht op de verkeerde plekken en vond dus niets

Maar als ik het goed begrijp kun je het in Access dus niet expliciet specificeren maar wordt het impliciet wel ondersteund als je update en delete acties uitvoert. In principe vind ik het dan goed genoeg; ik ga niet onnodig veel moeite doen om het allemaal netjes te specificeren. Wat namelijk een heel belangrijk aspect is, is dat de database volledig buiten een DBMS als Access om beheert moet kunnen worden vanuit de browser. Dus die vinkjes zetten in dat relatie-venster in Access heeft ook weinig zin.

Het veranderen van de Access drivers is dan ook niet echt een optie aangezien het op Windows-servers met IIS moet kunnen draaien die ik zelf niet beheer.
Maar bedankt, ik weet genoeg. Dit topic mag van mij gesloten worden,

"People should know when they're conquered..."


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Volgens mij heb je me verkeerd begrepen, ik bedoelde dat je ON DELETE CASCADE wel moet kunnen specificeren als je het via de nieuwe drivers doet, deze zitten in een standaard Windows installatie, dus je zou dat eens kunnen proberen.

Het is niet zo dat Access het standaard ondersteunt.

Volgens mij heb je 2 opties:


• Proberen het SQL statement met cascading updates/deletes uit te voeren via de jet oledb drivers
• Proberen het via ADOX te doen

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1