2009-11-02 13 views
0

J'essaie de créer une contrainte de vérification sur une table d'accès (jet?).Est-il possible de créer une contrainte de vérification en accès et/ou DAO?

Donc, j'ouvrir le fichier .mdb avec accès, allez dans queries-> Créer une requête en vue de la conception, Type esc, puis menu-> view-> requête et enfin taper

create table X ( un nombre, vérifier (a> 20) )

mais l'accès pense que j'ai une "erreur de syntaxe dans la définition de champ". Cependant, je ne le pense pas. Donc ma question: est-il possible de créer une contrainte de vérification avec accès. Si c'est le cas, comment.

En outre, je voudrais créer la contrainte avec dao/vba, pas sur l'interface graphique. Est-ce possible? Et enfin, sur une note légèrement liée: comment entrer les instructions sql en accès. Je ne peux pas imaginer que je doive utiliser les requêtes-> design view-> query-> voir l'itinéraire pour le faire. Je suis habitué au SQL * Plus d'Oracle, que j'aime beaucoup, et j'espère qu'il y aura quelque chose de similaire pour l'accès.

Merci pour toute entrée René

Répondre

2

Voici quelques notes.

Vous pouvez créer une requête SQL pour Oracle (Sélectionner le menu "requête"> "SQL spécifique"> "Pass-Through")

Depuis Access 2003, vous pouvez sélectionner SQL Server compatible Syntaxe (ANSI 92) (http://office.microsoft.com/en-us/access/HA010345621033.aspx)

Une règle de validation avec VBA/DAO

''Reference: Microsoft DAO x.x Object Library 

Dim tdf As TableDef 
Dim db As Database 

Set db = CurrentDb 

Set tdf = db.TableDefs("Table1") 

tdf.Fields("aDouble").ValidationRule = "<10" 
tdf.Fields("aDouble").ValidationText = "Must be less than 10" 

contraintes avec ADO/VBA. Voir (http://msdn.microsoft.com/en-us/library/aa140015(office.10).aspx)

''Reference: Microsoft ADO Ext. x.x for DDL and Security 

Dim cn As ADODB.Connection 'For action queries 
Dim rs As ADODB.Recordset 'For select queries 
Dim s As String 
Dim RecordsAffected As Long 

Set cn = CurrentProject.Connection 

''You can store sql in a table 
s = DLookup("SQLText", "sysSQL", "ObjectName='q1'") 
''Result: CREATE TABLE tblCreditLimit (LIMIT DOUBLE) 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

''You can run queries from VBA 
s = "INSERT INTO tblCreditLimit VALUES (100)" 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

s = "CREATE TABLE tblCustomers (CustomerID COUNTER, CustomerName Text(50))" 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

s = "INSERT INTO tblCustomers VALUES (1, 'ABC Co')" 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

s = "ALTER TABLE tblCustomers " _ 
    & "ADD COLUMN CustomerLimit DOUBLE" 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

''You can add contraints using ADO like so: 
s = "ALTER TABLE tblCustomers " _ 
    & "ADD CONSTRAINT LimitRule " _ 
    & "CHECK (CustomerLimit <= (SELECT LIMIT " _ 
    & "FROM tblCreditLimit))" 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

s = "UPDATE tblCustomers " _ 
    & "SET CustomerLimit = 200 " _ 
    & "WHERE CustomerID = 1" 
''Error occurs here 
cn.Execute s, RecordsAffected 

s = "UPDATE tblCustomers " _ 
    & "SET CustomerLimit = 90 " _ 
    & "WHERE CustomerID = 1" 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

''Clean up 
''You cannot do this through the database window, 
''because of the constraint. 
s = "ALTER TABLE tblCustomers DROP CONSTRAINT LimitRule " 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

s = "DROP TABLE tblCustomers " 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 

s = "DROP TABLE tblCreditLimit " 
cn.Execute s, RecordsAffected 
Debug.Print RecordsAffected 
+0

Vous avez besoin d'une contrainte CHECK sur votre table 'tblCreditLimit' pour vous assurer qu'il n'y a jamais plus d'une ligne, sinon vous obtiendrez une erreur lorsque votre contrainte CHECK 'LimitRule' est testée. – onedaywhen

+0

... et en raison de la sémantique des contraintes CHECK, il est probablement préférable d'éviter de référencer plus d'une table dans la même contrainte CHECK. La règle que vous utilisez est plus adaptée à une ASSERTION que le moteur de base de données Access ne supporte pas;) – onedaywhen

1

Il est de règle de validation sur une colonne. Vous pouvez utiliser VB pour l'accès. pas de SQL * Plus ici ... Vous pouvez toujours utiliser SQL Express comme source de données - avec tous les avantages du serveur sql réel et utiliser l'accès uniquement comme front.

+0

ms-access-> Table-> Design View-> Règle de validation. mettre à> 20. Ne pensez pas que vous pouvez le faire via le langage de définition de données, par ex. Créer une table – heferav

+0

@heferav: oui, peut être fait avec SQL DDL. Vous devez être en mode de requête ANSI-92, en utilisant l'interface utilisateur Access ou le code OLE DB (par exemple, ADO classic dans VBA). – onedaywhen

+0

Acceptez @ un jour quand la connaissance supérieure sur ADO (que j'ai tendance à éviter comme une barre de péniche). – heferav

1

[Microsoft Jet SQL intermédiaire pour Access 2000] Pour ce faire, dans Access, vous devez d'abord ouvrir l'interface en ANSI-92 Query Mode je l'ai testé SQL code DDL:. Il fonctionne très bien et crée une . colonne de type FLOAT (Double)

est-ce n'est pas possible de le faire en utilisant DAO mais vous pouvez utiliser ADO longue histoire courte:. CHECK contraintes ont été introduites dans le moteur à l'ère Jet 4.0 lorsque l'équipe d'accès favorisait l'ADO Avec Access2007, les Access Team sont de nouveau en faveur de DAO mais n'ont pas encore branché les «trous» de Jet 4.0 dans DAO. nctionalité (types de données compressibles, types de données texte de longueur fixe, clés étrangères rapides, etc.) vous devez utiliser ADO.

+0

+1 pour une réponse très informative. –

+0

En fait, je m'interroge sur l'affirmation que "les contraintes de vérification ont été introduites ... dans Jet 4" - les règles de validation au niveau des tables et des champs ont toujours existé dans Access (au moins à partir de Jet 2). Maintenant, s'il y avait DDL pour les créer/les modifier est un problème différent, et il se pourrait que tout ce qui est arrivé avec la version de Jet 4 était l'ajout de la prise en charge DDL cohérente avec d'autres bases de données. Vous pouvez certainement les créer dans DAO en utilisant le modèle d'objet DAO (ne pas exécuter d'instructions DDL). –

+0

@David W. Fenton: "il se pourrait que tout ce qui s'est passé avec la sortie de Jet 4 ait été l'ajout du support DDL" - Pas du tout. Le nom «Table Validation Rule» est trompeur; 'Row Validation Rule' serait préférable car il ne s'applique qu'à la ligne courante. Une contrainte CHECK peut toutefois référencer des valeurs dans d'autres lignes de la même table et même d'autres tables ... – onedaywhen

0

Vous ne pouvez pas utiliser l'ANSI standard dans le générateur de requête SAUF si vous définissez la base de données comme compatible sql ansi. Si vous modifiez ce paramètre, alors vous pouvez utiliser le sql dans le générateur de requête comme vous l'avez fait. Cependant, je ne recommanderais pas de modifier ce paramètre pour les bases de données existantes.

Si vous le faites, vous pouvez taper:

CREATE TABLE z1 
     (id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER , 
check (id < 20), 
constraint Mypk primary key (id)) 

En vous n'avez pas besoin de sauver le sql dans le générateur de requête, et vous voulez juste taper dans le sql, puis simplement Whack ctrl-g pour obtenir l'invite de ligne de commande d'accès, et vous pouvez taper:

currentproject.Connection.Execute "CREATE TABLE 
    z1(id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER , 
    check (id < 20), 
    constraint Mypk primary key (id))" 

Ce qui précède devrait être tapé sur une ligne. Ainsi, vous pouvez utiliser l'invite de ligne de commande si vous le souhaitez.