Можно ли создать контрольное ограничение в access и / или DAO?
-
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) )"
Все вышесказанное было бы набрано в одну строку.Итак, вы можете использовать приглашение командной строки, если хотите..