Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是SQL Server模拟MySql';触发器中有新的.some_列吗?_Mysql_Sql_Sql Server - Fatal编程技术网

什么是SQL Server模拟MySql';触发器中有新的.some_列吗?

什么是SQL Server模拟MySql';触发器中有新的.some_列吗?,mysql,sql,sql-server,Mysql,Sql,Sql Server,这是我第一次处理SQL Server触发器 在此之前,我为MySql服务器编写了几乎相同的触发器,现在尝试为SQL Server重新编写。我把所有的东西都修好了,但现在不明白它想要什么?还有什么方法可以像在MySQL-NEW.some_字段中一样访问刚刚插入的行的某些列 CREATE TRIGGER AntiCloneInsert ON dbo.user_item FOR INSERT AS DECLARE @acc_id INT; DECLARE @items_count INT; IF

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

在此之前,我为MySql服务器编写了几乎相同的触发器,现在尝试为SQL Server重新编写。我把所有的东西都修好了,但现在不明白它想要什么?还有什么方法可以像在MySQL-NEW.some_字段中一样访问刚刚插入的行的某些列

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
我试图创建此触发器,但出现以下错误:

Msg 4104,16级,状态1,程序反克隆插入,第6行
无法绑定多部分标识符“NEW.item_type”

Msg 4104,16级,状态1,程序反克隆插入,第8行
无法绑定多部分标识符“NEW.item_type”

Msg 4104,16级,状态1,程序反克隆插入,第8行
无法绑定多部分标识符“NEW.warehouse”

Msg 4104,16级,状态1,程序反克隆插入,第11行
无法绑定多部分标识符“NEW.char\u id”


SQL Server没有
new
old
记录。相反,它插入了
删除了
表。这意味着可以使用集合操作(或者循环,如果您愿意的话)来完成逻辑

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

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

SQL Server没有
new
old
记录。相反,它插入了
删除了
表。这意味着可以使用集合操作(或者循环,如果您愿意的话)来完成逻辑

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

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查询来改进它。我不明白你的触发器是怎么工作的,不能修改它<代码>插入dbo.user\u值($char\u id,1,0,NULL,DATEDIFF(s,'1970-01-01 00:00:00',GETUTCDATE()),NULL,getdate())@Kosmos。我不理解你的评论,也看不出它与你的查询有什么关系(例如,表名是不同的)。也许你应该问另一个问题。我的意思是,这个插入查询应该与我版本的触发器中的
update
查询一起执行,但是guy今天告诉我触发器禁止所有玩家,所以它的逻辑有问题。他现在正试图重新检查禁赛球员的规则。所以,再也不需要做什么了。谢谢,谢谢。但是你能再帮我一次吗?我向某个需要它的人触发了这个触发器,现在他告诉我,需要在
update
之后使用额外的insert查询来改进它。我不明白你的触发器是怎么工作的,不能修改它<代码>插入dbo.user\u值($char\u id,1,0,NULL,DATEDIFF(s,'1970-01-01 00:00:00',GETUTCDATE()),NULL,getdate())@Kosmos。我不理解你的评论,也看不出它与你的查询有什么关系(例如,表名是不同的)。也许你应该问另一个问题。我的意思是,这个插入查询应该与我版本的触发器中的
update
查询一起执行,但是guy今天告诉我触发器禁止所有玩家,所以它的逻辑有问题。他现在正试图重新检查禁赛球员的规则。所以,再也不需要做什么了。非常感谢。