Sql server 将Oracle SQL触发器转换为SQL Server触发器
我曾尝试将Oracle中编写的触发器转换为SQL Server触发器。但它不允许在查询中使用表别名和:OLD关键字。你知道如何进行正确的转换吗 Oracle触发器:Sql server 将Oracle SQL触发器转换为SQL Server触发器,sql-server,oracle,tsql,Sql Server,Oracle,Tsql,我曾尝试将Oracle中编写的触发器转换为SQL Server触发器。但它不允许在查询中使用表别名和:OLD关键字。你知道如何进行正确的转换吗 Oracle触发器: CREATE OR REPLACE TRIGGER TRG_DEL_AM_LABELS BEFORE DELETE on AM_LABELS FOR EACH ROW BEGIN DELETE FROM AM_LABEL_URLS ALU WHERE ALU.LABEL_ID =
CREATE OR REPLACE TRIGGER TRG_DEL_AM_LABELS BEFORE DELETE on AM_LABELS
FOR EACH ROW
BEGIN
DELETE FROM AM_LABEL_URLS ALU WHERE ALU.LABEL_ID = :OLD.LABEL_ID;
END;
已转换的SQL Server触发器:
CREATE OR ALTER TRIGGER TRG_DEL_AM_LABELS
ON AM_LABELS
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM AM_LABEL_URLS ALU
WHERE ALU.LABEL_ID = :OLD.LABEL_ID;
END
CLOSE DELETED_CUR;
DEALLOCATE DELETED_CUR;
DELETE FROM AM_LABELS WHERE (.LABEL_ID;) IN (SELECT .LABEL_ID; FROM DELETED);
;
这些是突然出现的错误
“:”附近的语法不正确
“ALU”附近的语法不正确
但正如文档中提供的,此查询在SQL Server中使用是有效的。使用已删除的表访问旧值: DML触发器语句使用两个特殊的表:删除的表和 插入的表。SQL Server自动创建和管理 这些桌子。您可以使用这些临时的内存驻留表来 测试某些数据修改的效果并设置条件 用于DML触发操作 删除的表存储删除和删除期间受影响行的副本 更新语句。在执行删除或更新期间 语句,则从触发器表中删除行并将其传输到 删除的表。删除的表和触发器表 没有共同的行
请参见不确定键入的原因。标签\u ID;到处都是。它是从已删除中选择标签ID,而不是选择。标签ID;从已删除。谢谢,我能够解决Alies错误。但仍然无法理解:旧的关键字错误@你知道多少年可以被替换吗deleted@Chamindu答案中解释了这一点,您当前的代码中已经有了它,尽管使用了随机标点符号:SELECT LABEL_ID FROM DELETED。因此,不需要使用:OLD,而应该使用以下查询。在AM_标签上创建或更改触发器TRG_DEL_AM_标签,而不是像BEGIN DELETE ALU FROM DELETED那样删除,AM_LABEL_URL ALU,其中ALU.LABEL_ID=DELETED.LABEL_ID;结束关闭已删除的\u CUR;取消分配已删除的\u CUR;从AM_标签中删除,其中标签_ID在选择标签_ID FROM DELETED@Chamindu需要理解的关键点是Oracle通过变量公开值,SQL Server通过表公开值