创建触发器以根据插入的行更改 table 添加列

create a trigger to alter table add column based on inserted row

我在数据库中有两个 table,名称如下:

1. state_master
+---------------+-------------------+
|      state_id |        state_name |
+---------------+-------------------+
|             1 |               new |
|             2 |          assigned |
|             3 |       in_progress |
|             4 |           on_hold |
|             5 |            closed |
+---------------+-------------------+



2. store_complaint_state_count
+----------+-----+--------+------------+-------+------+
| store_id | new |assigned| in_progress|on_hold|closed|          
| 101      | 1   |2       | 2          |0      |0     |
| 102      | 5   |4       | 1          |0      |2     |
+----------+-----+--------+------------+-------+------+

现在我想在 state_master state_id =6 和 state_name=reopen 中添加另一行。 我想创建一个触发器,它可以改变 table store_complaint_state_count 并在其中添加重新打开的列。

我创建了一个过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `alterTablestorewisecomplaintcount`(in state int )
BEGIN
    alter table storewisecomplaintcount
    add column state INT UNSIGNED ZEROFILL NOT NULL DEFAULT 0;

END

还有一个触发器:

CREATE DEFINER = CURRENT_USER
    TRIGGER `nxtlife_sfcms_db_v2`.`complaint_state_AFTER_INSERT`
    AFTER INSERT ON `complaint_state`

FOR EACH ROW

BEGIN

call alterTablestorewisecomplaintcount(new.state_value);

END

但是在插入的时候报错:

ERROR 1422: 1422: Explicit or implicit commit is not allowed in stored function or trigger.

不应该那样使用触发器;而不是每次都改变能力并添加一列;你应该使用单个列说 Status 它将包含所有不同的状态值,如

store_complaint_state_count: Status varchar(20);

Status
new 
assigned
in_progress
on_hold
closed
reopen

然后您可以修改您的触发器代码以将该值填充为 store_complaint_state_count table

CREATE DEFINER = CURRENT_USER
    TRIGGER `nxtlife_sfcms_db_v2`.`complaint_state_AFTER_INSERT`
    AFTER INSERT ON `complaint_state`

FOR EACH ROW

BEGIN

INSERT INTO store_complaint_state_count (store_id, `Status`) VALUES(105, new.state_name);

END

您不能对触发器执行 ALTER 或 DROP 操作。这些是您在错误消息中看到的隐式提交(查看更多详细信息 here

即使可以通过一些变通方法实现,这也是错误的设计。如果你能做你想做的事——第一次插入 table 会添加该列,从那时起——所有其他插入都会失败,因为该列已经存在

您好,您可以创建 table 并在 table 中记录所有事件。

create table dbLOG (Id Int Identity(1,1),PostTime 
VARCHAR(50),ServerName VARCHAR(25),UserName VARCHAR(15),CommandText 
   VARCHAR(MAX))
        go

                CREATE TRIGGER [db_LOG]
                ON DATABASE 
                FOR create_table,alter_table,drop_table
                ,create_PROCEDURE, alter_PROCEDURE,drop_PROCEDURE
                ,ALTER_function,create_function,drop_function
                ,ALTER_trigger,create_trigger,drop_trigger
               AS
               SET NOCOUNT ON
               DECLARE @xEvent XML
            SET @xEvent = eventdata() --capture eventdata regarding SQL statement user have fired
            INSERT INTO dbLOG VALUES(
            REPLACE(CONVERT(VARCHAR(50), @xEvent.query('data(/EVENT_INSTANCE/PostTime)')),'T', ' '),
            CONVERT(VARCHAR(25), @xEvent.query('data(/EVENT_INSTANCE/ServerName)')),
            CONVERT(VARCHAR(15), @xEvent.query('data(/EVENT_INSTANCE/UserName)')),
            CONVERT(VARCHAR(MAX), @xEvent.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)'))
            )