2009-11-02 3 views
0

액세스 (jet?) 테이블에서 check 제약 조건을 만들려고합니다.액세스 및/또는 DAO에서 check 제약 조건을 생성 할 수 있습니까?

그래서, 나는 ( 를 디자인 뷰에서 쿼리 형 ESC, 다음 메뉴 ->보기 -> 쿼리를 만들> queries-에 가서 마지막으로 테이블 X를 만들

입력 액세스를 .mdb 파일을 엽니 다 체크 (a> 20) )

하지만 액세스는 "필드 정의에 구문 오류가 있습니다"라고 생각합니다. 그러나, 나는 그렇게 생각하지 않는다. 따라서 내 질문 : 액세스 가능한 검사 제약 조건을 만들 수 있습니다. 그렇다면 : 어떻게.

또한 GUI가 아닌 dao/vba를 사용하여 제약 조건을 만들고 싶습니다. 그게 가능하니?

마지막으로, 약간 관련있는 메모에서 : 어떻게 SQL 문을 액세스에 입력합니까? 그렇게하기 위해 쿼리 -> 디자인보기 -> 쿼리 ->보기 경로를 사용해야한다는 것을 상상할 수 없습니다. 필자는 오라클의 SQL * Plus에 익숙합니다. 나는 이것을 아주 좋아합니다. 또한 액세스와 비슷한 점이 있기를 바랍니다. 모든 입력 르네

답변

2

다음은 몇 가지 메모입니다.

당신은 오라클을위한 통과 쿼리를 만들 수 있습니다 (선택 메뉴 "쿼리"> "SQL 특정"> "통과") 액세스 2003 년 이후

, 당신은 SQL 서버 호환 구문 (ANSI 92를 선택할 수 있습니다) (http://office.microsoft.com/en-us/access/HA010345621033.aspx)

''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와 VBA/DAO있는 유효성 검사 규칙. . 잘 작동하고를 만듭니다 (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

'tblCreditLimit'테이블에 CHECK 제약 조건이 있어야만 한 행 이상 있는지 확인할 수 있습니다. 그렇지 않으면 CHECK 제약 조건 인 LimitRule이 테스트 될 때 오류가 발생합니다. – onedaywhen

+0

... CHECK 제약 조건의 의미로 인해 동일한 CHECK 제약 조건에서 둘 이상의 테이블을 참조하지 않는 것이 가장 좋습니다. 사용중인 규칙은 Access 데이터베이스 엔진이 지원하지 않는 ASSERTION에 더 적합합니다.) – onedaywhen

1

에 대한

감사 열에 유효성 검사 규칙이있다. 액세스 용 VB를 사용할 수 있습니다. 여기에 SQL * Plus가 없습니다 ... SQL Server Express를 데이터 소스로 언제든지 사용할 수 있습니다 - 실제 SQL Server의 모든 이점을 사용하고 액세스 권한 만 사용하십시오.

+0

ms- 액세스 -> 테이블 -> 디자인보기 -> 유효성 검사 규칙. > 20으로 설정하십시오. 당신이 데이터 정의 언어를 통해 그것을 할 수 있다고 생각하지 마십시오. 테이블 생성 – heferav

+0

@heferav : 예, SQL DDL로 수행 할 수 있습니다. 액세스 UI 또는 OLE DB 코드 (예 : VBA의 ADO classic)를 사용하여 ANSI-92 쿼리 모드 여야합니다. – onedaywhen

+0

은 ADO에 관한 @ onedaywhen의 우수한 지식을 수용합니다 (바지 폴처럼 피하는 경향이 있습니다). – heferav

1

Access에서이 작업을 수행하려면 먼저 ANSI-92 Query Mode에 인터페이스를 열 필요가 나는 당신의 SQL의 DDL 코드를 테스트 한 [액세스 2000 중급있는 Microsoft Jet SQL]을 참조하십시오 . 유형 FLOAT (더블)의 열

인가이 사용하는 DAO를 할 수 없습니다하지만 당신은 ADO를 사용할 수 길고도 짧은 이야기 :. CHECK 제약은 액세스 팀은 ADO를 선호 한 제트 4.0 시대에 엔진에 도입 Access2007의 효과로 접근 팀은 DAO를지지하지만 DAO에서는 아직 Jet 4.0 '구멍'을 꽂지 않았습니다 .Jet 4.0의 대다수 - fu nctionality (압축 가능한 데이터 형식, 고정 길이 텍스트 데이터 형식, 빠른 외래 키 등) ADO를 사용해야합니다.

+0

+1 매우 유익한 답변입니다. –

+0

사실, "제약 조건이 도입되었습니다 ... Jet 4에서"- 테이블 수준 및 필드 수준 유효성 검사 규칙이 항상 Access (적어도 Jet 2부터)에 존재한다는 내용에 대해 궁금합니다. 이제 DDL을 생성/변경하기위한 DDL이 있는지 여부는 다른 문제이며 Jet 4의 릴리스에서 발생한 모든 사항은 다른 데이터베이스와 일관된 DDL 지원의 추가였습니다. DAO 개체 모델 (DDL 문을 실행하지 않음)을 사용하여 DAO에서 확실히 만들 수 있습니다. –

+0

@David W. Fenton : "Jet 4의 출시로 인해 발생한 모든 문제가 DDL 지원을 추가 한 것일 수도 있습니다."- 그렇지 않습니다. '표 확인 규칙'이라는 이름은 오해의 소지가 있습니다. '행 유효성 검사 규칙'은 현재 행에만 적용되므로 더 좋습니다. 그러나 CHECK 제약 조건은 동일한 테이블의 다른 행과 다른 테이블의 값을 참조 할 수 있습니다. – onedaywhen

0

데이터베이스를 SQL ANSI 호환으로 설정하지 않는 한 쿼리 작성기에서 표준 ANSI를 사용할 수 없습니다. 이 설정을 변경하면 CAN은 쿼리 작성 도구에서 sql을 그대로 사용할 수 있습니다. 그러나 기존 데이터베이스에 대해서는이 설정을 변경하지 않는 것이 좋습니다.당신이 경우에

, 당신이 입력 할 수 있습니다 쿼리 빌더에서 SQL을 저장 할 필요가 없습니다에

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

을, 그냥 SQL에 입력합니다, 단순히 CTRL-g를 구타 액세스 명령 행 프롬프트를 얻으려면 다음을 입력하십시오.

위의 내용은 한 행에 입력됩니다. 따라서 원하는 경우 명령 줄 프롬프트를 사용할 수 있습니다.