什么是SQL Server模拟MySql';触发器中有新的.some_列吗?
这是我第一次处理SQL Server触发器 在此之前,我为MySql服务器编写了几乎相同的触发器,现在尝试为SQL Server重新编写。我把所有的东西都修好了,但现在不明白它想要什么?还有什么方法可以像在MySQL-NEW.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
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今天告诉我触发器禁止所有玩家,所以它的逻辑有问题。他现在正试图重新检查禁赛球员的规则。所以,再也不需要做什么了。非常感谢。