2011-12-20 1 views
1

머리말 :

MySQL 백 엔드에 대해 MS Access 2010 프런트 엔드를 실행하고 있습니다.MySQL DB에 대해 일련의 SQL 명령을 실행하고 프런트 엔드로 MS Access 2010을 롤백 할 수없는 경우 어떻게합니까?

나는 해당 회사 사이트에 링크되어 있고 필요한 경우 사용자가 사이트를 삭제할 수 있도록하려는 사이트 및 직원이있는 회사가 있지만, 이는 해당 사이트에 연결된 직원이없는 사이트가없는 경우에만 가능합니다. MySQL의 외래 키는 이것을 강제합니다. 따라서 사이트에서 삭제를 시도하고 해당 사이트와 관련된 직원이 여전히 오류가 있으면 오류가 발생합니다.

그러나 삭제가 유효한지 확인하기 위해 테스트해야하는 유일한 방법은 시도하고 삭제하는 것이지만 삭제가 성공하면 확인하는 것입니다. 하지만 나는 삭제가 가능하기 전에 테스트가 가능해 지길 원한다. 그래서 삭제가 실행되기 직전에 발생하는 다른 모든 코드가 있으면 해결할 수있다.

"Start Transaction; ..... Rollback;을 사용하는 것에 대해 생각했습니다." 하지만 그것은 내가 접근 할 수있는 어떤 방법 으로든 MySQL에 접근 할 수 없다. 또는 롤백, 그래서 삭제를 통과 아닌 "트랜잭션을 시작합니다"; 수

1) 패스 스루 쿼리을 (하지만 분명히 당신은 단지 작업 당 하나 개의 쿼리를 전달할 수 있습니다 ") :(

: 나는 시도 2) 이 절차를 저장 -하여 사이를 실행하는 저장 프로 시저로 삭제 전달 "시작 트랜잭션;"와 "롤백;"와 같은 :

DELIMITER $$ 

CREATE DEFINER=`root`@`%` PROCEDURE `SP_TestStatementExecution`(
     IN SQLString TEXT 
    ) 
BEGIN 
    START TRANSACTION; 
     SET @query := SQLString; 
     PREPARE stmt FROM @query; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    ROLLBACK; 
END 

하지만 그게 잘못된 때 오류하지 않는 것 같습니다 : (

정말 너무 이런 식의 생각을 한 번에 여러 문에서 통과 할 수 있도록하고 싶습니다 :

------------------------------------------------------------------------------ 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`%` PROCEDURE `SP_TestStatementsExecution`(
     IN SQLString TEXT 
    ) 
BEGIN 
    SET @Delim = ";"; 
    SET @Pos2 = INSTR(SUBSTRING(SQLString,@Pos1), @Delim); 

    START TRANSACTION; 
     WHILE @Pos2 > 0 DO 
      SET @query = SUBSTRING(
           SQLString, 
           1, 
           @Pos2 
          ); 

      PREPARE stmt FROM @query; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 

      SET SQLString = SUBSTRING(SQLString,@Pos2 + 1); 
      SET @Pos2 = INSTR(SUBSTRING(SQLString,1), @Delim); 
     END WHILE; 
    ROLLBACK; 
END 

하지만 나는 실행을 중지하고 즉 액세스 할 오류를 반환하는 오류를 얻을 때까지 ... 잘함

질문 :

일련의 SQL 문이 DB에 커밋하지 않고 MySQL의에서 실행할 경우에는 어떻게 테스트 할 수 있습니까?

나는 현재 직접 통합 문서에 액세스 '롤백을 사용하여 작업을하고 있지만, 직접 가능하면 MySQL의에서 그것을 할 수있을 것을 선호

답변

0

내가 사용하는 해결책은 Accesses 자체 Workspace를 사용하여 트랜잭션을 롤백하는 것입니다. 정말 이상적은 아니지만 필요한 일을했습니다.

방법 :이 다른 사람 도움

Sub Test() 
    'Create a Workspace 
    Dim wrk As DAO.Workspace 
    Set wrk = DBEngine(0) 

    'Begin the transaction 
    wrk.BeginTrans 
     'Setup error trapping 
     On Error GoTo WrkTrap 
     'DO INSERTS & UPDATES HERE 
     '.... 
     '.... 
    'Commit the transaction 
    wrk.CommitTrans 
    'Return normal error trapping 
    On Error GoTo Trap 
    'Do more stuff here if needed 
    '... 
    '... 

TidyUp: 
    'Do tidy up here 
    '... 

    'Exit before Error Code runs 
    Exit Sub 
WrkTrap: 
    'Rollback the transaction 
    wrk.Rollback 
Trap: 
    Debug.Print "ErrorNum = '" & Err.Number & "', Desc = '" _ 
    & Err.Description & "'" 

    'Do any error loggin here... 

    'Jump to methods cleanup code 
    Resume TidyUp 
End Sub 

희망. :)

0

내 접근 방식은 두 개의 열이있는 sites_to_delete 테이블을 추가하는 것입니다 : 정말 tinyint 및 상태 int.

이 테이블에 삽입 트리거를 추가하여 삭제 가능성을 확인 (실제로 = 0)하거나 사이트를 삭제 (실제로 = 1)하고 결과를 상태에 씁니다.

이 기능은 사이트를 확인 또는 삭제하여 Access를 통해 직접 작동하는 간단한 삽입 -> 선택 순서로 변환합니다.

+0

내 문제는 어떻게 내가이 에테르를 구현하는 방법을 잘 모르겠습니다 삭제할 ​​수있는 사이트를 확인할 수 있습니까? 또한 내가 열을 좋아하는 테이블에 모든 종류의 데이터를 전달해야 할 것이기 때문에 이것은 매우 복잡 할 것이다. – GazB

관련 문제