【问题标题】:SQL Server insert trigger not workingSQL Server 插入触发器不起作用
【发布时间】:2012-11-11 11:17:04
【问题描述】:

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

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

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 

假设在 LOG_CONNECT201211 表中插入了条目,则在 BEGIN : END 中运行查询。但是即使我在LOG_CONNECT201211 中插入了多个数据,也没有发生任何事情。

【问题讨论】:

  • 您的触发器没有引用 INSERTED 是故意的吗?
  • 您没有在触发器中的任何位置引用Inserted 伪表似乎很奇怪......您基本上是在升级一切 - 不仅仅是行实际上是插入的......
  • 嗯,抱歉,这是我第一次使用触发器。如果我做错了什么,你能告诉我吗?
  • 您的触发器应该根据插入的行做一些事情——这些可以在您的触发器的Inserted 伪表中找到。这里的这个只是一直更新其他表并且不考虑/不使用已插入行中的任何信息....所以问题是:如果您插入 10 个新行-在您的触发器中,您到底想对这些做什么?你想达到什么目的?
  • 类似条件的东西?你能帮我么?谢谢。

标签: sql sql-server triggers insert


【解决方案1】:

当您的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_LOGINCHAR_DATA0LOG_USING_DEPOT201211 表的更新进入一个完全独立的、不相关的表 LOG_CONNECT201211 ??

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

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

【讨论】:

  • 是的,我希望如果将一行插入到 LOG_CONNECT201211 中,则会触发更新查询。那是怎么做的?
  • @user1553142:那么您希望在UPDATE 查询中使用插入行中的哪些列/值
  • 嗯。我认为我做错了,我不想要插入的行中的任何内容。
  • @user1553142:在这种情况下,INSERT 触发器绝对是错误的方法!
  • @user1553142:我需要知道你什么时候想做什么,到底想做什么 - 仍然不清楚......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多