0

这是我第一次使用触发器。

我的触发器没有被触发,请帮忙。

CREATE TRIGGER sbhack_autoban
ON LOG_CONNECT201211
FOR INSERT
AS
  BEGIN
      /* query to run if single or multiple data is 
       inserted into LOG_CONNECT201211 table */
      UPDATE login.dbo.USER_CHECK_LOGIN
      SET    login.dbo.USER_CHECK_LOGIN.CHECKLOGIN = 2
      WHERE  login.dbo.USER_CHECK_LOGIN.USER_KEY IN 
              (SELECT e.USER_KEY
                 FROM   game.dbo.CHAR_DATA0 AS e
                        INNER JOIN gamelogs.dbo.LOG_USING_DEPOT201211 AS p
                          ON e.CHAR_KEY = p.CHAR_KEY
                 WHERE  p.GATENUM = 150)
             AND login.dbo.USER_CHECK_LOGIN.CHECKLOGIN = 0
             AND login.dbo.USER_CHECK_LOGIN.USER_KEY != 51;
  END 

假设在表中插入条目时在 BEGIN : END 中运行查询LOG_CONNECT201211。但即使我将多个数据插入LOG_CONNECT201211.

4

1 回答 1

0

当您的INSERT触发器触发时 - 至少插入了一个新行!这是事实。

现在的问题是:假设已经插入了一个或多个新行 -想用这些知识做什么?

通常,您可以例如将列设置为您无法指定为默认约束的值 - 或者您可以插入该行已插入审计表或其他内容的事实......

所以你会有这样的事情:

CREATE TRIGGER sbhack_autoban
ON LOG_CONNECT201211
FOR INSERT
AS
    INSERT INTO LogAudit(InsertedDate, UserKey)
        SELECT 
             GETDATE(), i.User_Key
        FROM
             Inserted i

或类似的东西....

更新:好的,所以你想UPDATE在插入行时运行该语句 - 不是 100% 清楚,你想使用插入行中的哪些列/值 - 看起来e.UserKey只是列 - 对吗?

那么UPDATE将是:

UPDATE login.dbo.USER_CHECK_LOGIN
SET login.dbo.USER_CHECK_LOGIN.CHECKLOGIN = 2
WHERE  
   login.dbo.USER_CHECK_LOGIN.USER_KEY IN 
          (SELECT USER_KEY FROM Inserted)
   AND login.dbo.USER_CHECK_LOGIN.CHECKLOGIN = 0
   AND login.dbo.USER_CHECK_LOGIN.USER_KEY != 51;

更新#2:

我仍然不明白的一点是:当某些行被插入到一个完全独立的、不相关的表中时,为什么要运行使用USER_CHECK_LOGIN,CHAR_DATA0和表的更新?LOG_USING_DEPOT201211LOG_CONNECT201211

当您想要做某事时使用触发器,因为行已插入该表 - 但在这种情况下,您通常希望对已插入的行及其值执行某些操作......

我只是看不到插入LOG_CONNECT201211事件的行与您随后从中查询和更新的表之间有任何联系。链接在哪里??为什么在插入数据时需要运行 * thisUPDATELOG_CONNECT201211?如果将数据插入其中涉及的其中一个表中,这将是有意义的UPDATE- 但就像这样,它完全没有任何意义......

于 2012-11-11T11:39:41.527 回答