Можно ли создать контрольное ограничение в access и / или DAO?

StackOverflow https://stackoverflow.com/questions/1660512

  •  11-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать контрольное ограничение для таблицы access (jet?).

Итак, я открываю mdb-файл с помощью access, захожу в запросы-> создать запрос в режиме конструктора, набираю esc, затем меню-> вид-> запрос и, наконец, набираю

создайте таблицу X ( число, отметьте (a > 20) )

но access думает, что у меня "синтаксическая ошибка в определении поля".Однако я так не думаю.Поэтому мой вопрос:можно ли создать контрольное ограничение с помощью access?Если это так:как.

Кроме того, я бы хотел создать ограничение с помощью dao / vba, а не в графическом интерфейсе.Возможно ли это?

И, наконец, на слегка связанной ноте:как вы вводите инструкции sql в access?Я не могу себе представить, что для этого мне нужно использовать запросы-> проектный вид-> запрос-> просмотреть маршрут.Я привык к Oracle SQL * Plus, который мне очень нравится, и я надеюсь, что есть что-то подобное и для access.

Спасибо за любой вклад Рене

Это было полезно?

Решение

Вот несколько заметок.

Вы можете создать сквозной запрос для Oracle (выберите меню "Запрос" > "Специфичный для SQL" > "Сквозной").

Начиная с Access 2003, вы можете выбрать синтаксис, совместимый с SQL Server (ANSI 92). (http://office.microsoft.com/en-us/access/HA010345621033.aspx)

Правило проверки с помощью 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"

Ограничения с помощью ADO / VBA.Смотрите [Промежуточный Microsoft Jet SQL для 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

Другие советы

Для столбца существует правило проверки.Вы можете использовать VB для доступа.здесь нет SQL * Plus...Вы всегда можете использовать SQL Express в качестве источника данных - со всеми преимуществами реального sql server и использовать access только в качестве прикрытия.

Чтобы сделать это в Access, вам нужно сначала открыть интерфейс в Режим запроса ANSI-92.Я протестировал ваш SQL DDL-код:он работает нормально и создает столбец типа FLOAT (Двойной).

Невозможно сделать это с помощью DAO, но вы можете использовать ADO.Короче говоря, долгая история: CHECK ограничения были введены в движок в эпоху Jet 4.0, когда команда Access отдавала предпочтение ADO.Начиная с Access2007, команда Access вернулась к предпочтению DAO, но еще не заделала "дыры" Jet 4.0 в DAO.Таким образом, для большинства функциональных возможностей только для Jet 4.0 (сжимаемые типы данных, текстовые типы данных фиксированной длины, быстрые внешние ключи и т.д.) Вам необходимо использовать ADO.

Вы не можете использовать стандартный ANSI в построителе запросов, если не настроите базу данных как совместимую с sql ansi.Если вы измените этот параметр, то СМОЖЕТЕ использовать sql в построителе запросов так, как у вас есть.Однако я бы не рекомендовал изменять этот параметр для существующих баз данных.

Если вы это сделаете, вы могли бы ввести:

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

В вам не нужно сохранять sql в построителе запросов, и вы просто хотите ввести sql, затем просто нажмите ctrl-g, чтобы получить приглашение командной строки access, и затем вы можете ввести:

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

Все вышесказанное было бы набрано в одну строку.Итак, вы можете использовать приглашение командной строки, если хотите..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top