Pergunta

Eu estou tentando criar uma restrição de verificação em um (jet?) Tabela de acesso.

Então, eu abrir o arquivo .mdb com acesso, entrar em queries-> criar consulta na vista de design, Tipo de esc, então menu-> view-> consulta e, finalmente, digite

create table X ( um número, verificar (a> 20) )

mas o acesso acha que eu tenho um "erro de sintaxe na definição de campo". No entanto, eu não penso assim. Portanto, a minha pergunta: é possível criar uma restrição de verificação com acesso. Se assim for:. Como

Além disso, eu gostaria de criar a restrição com dao / VBA, não na GUI. Isso é possível?

E, finalmente, em uma nota ligeiramente relacionados: como você inserir instruções SQL para acesso. Eu não posso imaginar que eu tenho que usar o queries-> projetar view-> query-> rota vista, a fim de fazer isso. Estou habituado a da Oracle SQL * Plus, que eu gosto muito, e eu espero que haja algo semelhante para o acesso também.

Obrigado por qualquer entrada Rene

Foi útil?

Solução

Aqui estão algumas notas.

Você pode criar uma consulta passagem para Oracle (Select menu "consulta"> "Specific SQL"> "Pass-Through")

Desde Access 2003, você pode selecionar SQL Server Sintaxe Compatível (ANSI 92) ( http://office.microsoft.com/en-us/access/HA010345621033.aspx )

Uma regra de validação com 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"

Restrições com ADO / VBA. Veja [Intermediário Microsoft Jet SQL para o Access 2000] ( 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

Outras dicas

Não há regra de validação em uma coluna. Você pode usar o VB para o Access. não SQL * Plus aqui ... Você sempre pode usar SQL Express como uma fonte de dados -. Com todos os benefícios de servidor SQL real e acesso utilizado apenas como uma frente

Para fazer isso no Access, você precisa primeiro abrir a interface em ANSI -92 modo de consulta . Eu testei seu código SQL DDL:., Funciona bem e cria uma coluna do tipo FLOAT (Duplo)

é não é possível fazer isso usando DAO mas você pode usar ADO. Para encurtar a história: restrições CHECK foram introduzidos no motor na era Jet 4.0 quando o acesso à equipe foram favorecendo ADO. Com efeitos a partir de Access2007, a Equipe de Acesso estão de volta ao favorecendo DAO, mas ainda tem que ligar os Jet 4.0 'buracos' em DAO. Assim, para a maioria dos Jet 4.0 funcionalidade -apenas (tipos de dados compressíveis, tipos de dados de texto de comprimento fixo, rápido chaves estrangeiras, etc) você precisa usar ADO.

Você não pode usar ANSI padrão no construtor de consulta, a menos que você defina o banco de dados como SQL ANSI compatível. Se você alterar essa configuração, então você pode pode usar o sql no construtor de consulta que você tem. Eu não recomendaria a alteração dessa configuração para entanto bases de dados existente.

Se você fizer isso, você poderia digitar:

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

Em que você não precisa para salvar o sql no construtor de consulta, e só quero digitar o sql, então simplesmente bater ctrl-g para obter a linha de comando acesso rápido, e você pode em seguida, digite:

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

O acima seria digitado em uma linha. Assim, você pode usar a linha de comando prompt de se você quiser ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top