【问题标题】:What is SQL Server analog for MySql's NEW.some_column in triggers?触发器中 MySql 的 NEW.some_column 的 SQL Server 模拟是什么?
【发布时间】:2016-02-18 00:51:30
【问题描述】:

这是我第一次处理 SQL Server 触发器。

在此之前,我为 MySql Server 编写了几乎相同的触发器,现在尝试为 SQL Server 重新编写它。我修复了所有东西,但现在不明白它想要什么?我们如何才能像在 MySQL 中一样访问刚刚插入的行的某些列 - NEW.some_field?

CREATE TRIGGER AntiCloneInsert ON dbo.user_item FOR INSERT AS

DECLARE @acc_id INT;
DECLARE @items_count INT;

IF (NEW.item_type in (select item_type from dbo.forbidden_item_types))
BEGIN
    select @items_count = count(item_type) from dbo.user_item where item_type = NEW.item_type and warehouse = NEW.warehouse
    IF (@items_count > 1)
    BEGIN
        select @acc_id = account_id from dbo.user_data where char_id = NEW.char_id
        update lin2db.dbo.user_account set block_flag2 = 1 where uid = @acc_id
    END
END

我尝试创建此触发器但收到此类错误:

消息 4104,级别 16,状态 1,过程 AntiCloneInsert,第 6 行
无法绑定多部分标识符“NEW.item_type”。

消息 4104,级别 16,状态 1,过程 AntiCloneInsert,第 8 行
无法绑定多部分标识符“NEW.item_type”。

消息 4104,级别 16,状态 1,过程 AntiCloneInsert,第 8 行
无法绑定多部分标识符“NEW.warehouse”。

消息 4104,级别 16,状态 1,过程 AntiCloneInsert,第 11 行
无法绑定多部分标识符“NEW.char_id”。

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案1】:

    SQL Server 没有newold 记录。相反,它有inserteddeleted tables。这意味着可以使用集合操作(​​或循环,如果您愿意的话)来完成逻辑。

    我认为以下是等价的逻辑:

    CREATE TRIGGER AntiCloneInsert ON dbo.user_item FOR INSERT AS
    BEGIN   
        update ua
            set block_flag2 = 1
            from ua join
                 dbo.user_data ud
                 on ua.uid = ud.account_id join
                 inserted i
                 on ud.char_id = i.char_id join
                 dbo.forbidden_item_types it
                 on it.item_type = i.item_type
             where  (select count(it2.item_type)
                     from dbo.user_item it2
                     where it2.item_type = i.item_type and
                           it2.warehouse = i.warehouse
                    ) > 1;
    END
    

    【讨论】:

    • 谢谢。但是你能再帮我一次吗?我向某个需要它的人做了这个触发器,现在他告诉它需要在update 之后通过额外的插入查询来改进它。我不明白你的触发器是如何工作的,也无法修改它。 insert into dbo.user_punish values ($char_id, 1, 0, NULL, DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE()), NULL, getdate());
    • @Kosmos 。 . .我不明白您的评论,也看不到它与您的查询有何关系(例如,表名不同)。也许你应该问另一个问题。
    • 我的意思是这个插入查询应该与我的触发器版本中的update 查询一起执行,但是今天有人告诉我触发器会禁止所有玩家,所以它的逻辑有问题。他现在正试图重新检查禁止球员的规则。因此,无需再做任何事情。谢谢。
    猜你喜欢
    • 2013-05-12
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2017-06-01
    • 2012-03-13
    相关资源
    最近更新 更多