Как я могу выполнить серию команд SQL для БД MySQL, и если какая-либо из них не удастся откатить MS Access 2010 в качестве внешнего интерфейса? - PullRequest
1 голос
/ 20 декабря 2011

Предисловие:

У меня внешний интерфейс MS Access 2010 работает с внутренним MySQL.

У меня есть компании, у которых есть сайты и сотрудники, связанные с этими сайтами компаний, и я хочу разрешить пользователям удалять сайты, если это необходимо, НО это будет возможно только в том случае, если там, где нет сотрудников, связанных с этими сайтами, что хорошо, как Внешние ключи MySQL применяют это в любом случае, поэтому, если я пытаюсь удалить сайт, и все еще есть сотрудники, связанные с этим сайтом, это приводит к ошибкам.

НО единственный способ, которым я должен проверить, чтобы проверить, действительно ли удаление (будет работать), состоит в том, чтобы попытаться удалить его, НО тогда он выполнит удаление, ЕСЛИ все в порядке. Но я хочу иметь возможность проверить, возможно ли удаление перед выполнением удаления, чтобы я мог определить, должен ли выполняться весь другой код, который также происходит непосредственно перед удалением.

Я думал об использовании «Начать транзакцию; ..... Откат;» но это не может быть сделано с помощью доступа к MySQL любым способом, который я могу придумать. Я пробовал:

1) Passthrough Query (но, очевидно, вы можете пропустить только один запрос на операцию, чтобы я мог передать удаление, но не "Start Transaction;" или Rollback; "): (

2) Хранимая процедура - Передача удаления в хранимую процедуру, которая выполняет ее между «Начать транзакцию»; и "RollBack;" как:

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 выполняться в MySQL без фиксации в БД?

В настоящее время я работаю над прямым откатом Access с книгами, но предпочел бы иметь возможность сделать это в MySQL напрямую, если это возможно

Ответы [ 2 ]

0 голосов
/ 24 января 2012

Решение, с которым я пошел, состояло в том, чтобы использовать собственную Доступную рабочую область для отката транзакции.Это не было на самом деле идеально, но я выполнил нужную мне работу.

Метод был:

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 голосов
/ 20 декабря 2011

Мой подход заключается в добавлении таблицы sites_to_delete с двумя столбцами: действительно tinyint и status int.

Теперь добавьте триггер вставки в эту таблицу, который либо проверяет сайт на возможность удаления (действительно = 0), либо удаляет сайт (действительно = 1) и записывает результат в статус.

Это преобразует проверку или удаление сайта в простую последовательность вставки-> выбора, которая должна работать через Access и напрямую.

...