MYSQL:过程和触发器错误

MYSQL:过程和触发器错误,mysql,triggers,procedure,Mysql,Triggers,Procedure,我是MySQL的新手,我的过程中遇到了一个错误,我希望能够调用相同的东西来更新、插入和删除我的表,所以需要一个过程来调用。 我看过和其他一些,但没有任何帮助。delimiter关键字也不能产生seperate错误,但这没有帮助 错误是这样的,我无法理解它的含义: 错误 SQL查询: -- trigger on work log change DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES CREATE DEFINER = root@localhost PR

我是MySQL的新手,我的过程中遇到了一个错误,我希望能够调用相同的东西来更新、插入和删除我的表,所以需要一个过程来调用。 我看过和其他一些,但没有任何帮助。delimiter关键字也不能产生seperate错误,但这没有帮助 错误是这样的,我无法理解它的含义:

错误 SQL查询:

-- trigger on work log change
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES CREATE DEFINER = root@localhost PROCEDURE PROC_TRACK_CHANGES BEGIN INSERT INTO CHANGES( LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone ) 
SELECT NOW( ) , EmployeeID, LogTimeStamp, ProposalID, WorkDone
FROM WORKLOG;
MySQL说:

1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用“创建定义器”附近的正确语法=root@localhost程序进程跟踪更改 开始 在第3行中插入'

有问题的错误红色代码如下:

CREATE TABLE WORKLOG(
EmployeeID              BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY PKEY
LogTimeStamp            TIMESTAMP, -- PKEY
ProposalID              BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY
WorkDone                VARCHAR(200),
CONSTRAINT WORKLOG_FOREIGN_KEY_EMP FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEES (EmployeeID),
CONSTRAINT WORKLOG_FOREIGN_KEY_PRO FOREIGN KEY (ProposalID) REFERENCES PROPOSALS (ProposalID),
CONSTRAINT WORKLOG_PROPOSALS_PRIMARY_KEY PRIMARY KEY (EmployeeID, LogTimeStamp)
);

CREATE TABLE CHANGES(
LoggedTimeStamp         TIMESTAMP, -- PKEY
EmployeeID              BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY
LogTimeStamp            TIMESTAMP, -- fkey
ProposalID              BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY
WorkDone                VARCHAR(200),
CONSTRAINT CHANGES_FOREIGN_KEY_EMP FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEES (EmployeeID),
CONSTRAINT CHANGES_FOREIGN_KEY_PRO FOREIGN KEY (ProposalID) REFERENCES PROPOSALS (ProposalID),
CONSTRAINT CHANGES_PRIMARY_KEY PRIMARY KEY (LoggedTimeStamp)
);

-- trigger on work log change
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES
CREATE DEFINER=root@localhost PROCEDURE PROC_TRACK_CHANGES
BEGIN
    INSERT INTO CHANGES (LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone)
    SELECT now(), EmployeeID, LogTimeStamp, ProposalID, WorkDone FROM WORKLOG;
END;

DROP TRIGGER IF EXISTS TR_WORKLOG_UPDATE
CREATE DEFINER=root@localhost TRIGGER TR_WORKLOG_UPDATE
    BEFORE UPDATE ON 'WORKLOG'
    FOR EACH ROW
BEGIN
    CALL PROC_TRACK_CHANGES();
END;

DROP TRIGGER IF EXISTS TR_WORKLOG_INSERT
CREATE DEFINER=root@localhost TRIGGER TR_WORKLOG_INSERT BEFORE INSERT ON WORKLOG
FOR EACH ROW
BEGIN
    CALL PROC_TRACK_CHANGES();
END;

DROP TRIGGER IF EXISTS TR_WORKLOG_DELETE
CREATE DEFINER=root@localhost TRIGGER TR_WORKLOG_DELETE BEFORE DELETE ON WORKLOG
FOR EACH ROW
BEGIN
    CALL PROC_TRACK_CHANGES();
END;
我可能遗漏了一些简单的东西,但MYSQL调试器让我感到困惑。 非常感谢

试试这个:

DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES;
请注意末尾的分号。

过程删除是一条语句,也是一个过程创建。用分隔符分隔它们

另一件事是,您需要定义另一个分隔符,而不是;。否则,DB将在第一时间终止所有语句;这使得一些触发器和过程定义不完整。所以,举个例子

delimiter |
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES
|
CREATE DEFINER=root@localhost PROCEDURE PROC_TRACK_CHANGES
BEGIN
    INSERT INTO CHANGES (LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone)
    SELECT now(), EmployeeID, LogTimeStamp, ProposalID, WorkDone FROM WORKLOG;
END
|

您应该指定分号以外的临时分隔符,并在DROP PROCEDURE和CREATE PROCEDURE语句的末尾使用该分隔符

此外,您还需要在CREATEPROCEDURE语句中的过程名称后添加括号,即使它不带任何参数

这应该适合您:

DELIMITER $$

DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES $$

CREATE DEFINER=root@localhost PROCEDURE PROC_TRACK_CHANGES ()
BEGIN
    INSERT INTO CHANGES (LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone)
    SELECT now(), EmployeeID, LogTimeStamp, ProposalID, WorkDone FROM WORKLOG;
END $$

DELIMITER ;

触发器删除是一条语句,也是一个触发器创建语句。把它们分开;谢谢,我仍然对什么是单语句以及什么可以跨多行的语法感到困惑。使用分隔符的问题是我得到了错误:使用它时未知标点字符串。这很奇怪。如何执行此操作?我认为它来自于使用多个字符分隔符,如“//”或“$$”。。。现在我得到了一个“需要超级特权错误”,我认为这意味着它可以工作,只是不允许我这么做。