create trigger tr_del_check on RegisterInfo for delete as declare @check int select @check=p_no from deleted if exists( MedirecorderInfo.p_no=@check) begin rollback transaction raiserror('该挂号记录有相关联的病历记录,无法删除', 16, 1) end 运行有错误 请帮我修改
时间: 2024-03-21 07:43:54 浏览: 21
在该触发器中,MedirecorderInfo 表的判断条件不正确,应该使用 EXISTS 子句,而不是直接使用表名和字段名。同时,在触发器中抛出错误时,需要使用 THROW 语句,而不是 RAISERROR。以下是修改后的代码:
```
CREATE TRIGGER tr_del_check ON RegisterInfo
FOR DELETE
AS
BEGIN
DECLARE @check INT
SELECT @check = p_no FROM deleted
IF EXISTS (SELECT 1 FROM MedirecorderInfo WHERE p_no = @check)
BEGIN
ROLLBACK TRANSACTION
THROW 50000, '该挂号记录有相关联的病历记录,无法删除', 1
END
END
```
请注意,触发器的实际效果需要根据具体情况进行测试和验证。
相关问题
【简答题】 请为以下代码加上注释。 create trigger tr_delete on student for delete begin declare @bh char(5) select @bh=deleted.sno from deleted delete from studentcourse where sno=@bh end
```
-- 创建名为tr_delete的触发器,当对student表进行删除操作时触发
create trigger tr_delete
on student
for delete
begin
-- 声明一个变量@bh,类型为char(5)
declare @bh char(5)
-- 从被删除的记录中获取sno字段的值,并赋值给@bh变量
select @bh=deleted.sno from deleted
-- 在studentcourse表中删除sno等于@bh变量的记录
delete from studentcourse where sno=@bh
end
```
USE JXGL GO CREATE TRIGGER delete_sc_s ON S INSTEAD OF DELETE AS DECLARE @s_no char(8) SELECT @s_no=sno FROM deleted DELETE FROM SC WHERE sno=@s_no DELETE FROM S WHERE sno=@s_no GO USE JXGL GO 怎么使用这个触发器同时删除表S和表SC中级联的记录
要使用这个触发器同时删除表 S 和表 SC 中级联的记录,您需要在删除表 S 的同时,将涉及到的表 SC 中的记录也一并删除。因此,您需要在触发器中添加额外的 DELETE 语句以删除表 SC 中的相关记录。以下是修改后的触发器代码:
```
USE JXGL
GO
CREATE TRIGGER delete_sc_s ON S
INSTEAD OF DELETE
AS
DECLARE @s_no char(8)
SELECT @s_no=sno FROM deleted
DELETE FROM SC WHERE sno=@s_no
DELETE FROM S WHERE sno=@s_no
GO
USE JXGL
GO
DELETE FROM S WHERE sno='S13'
DELETE FROM SC WHERE sno='S13'
GO
```
在这个修改后的触发器中,当删除 S 表中的记录时,首先会删除 SC 表中与该记录相关的所有记录,然后再删除 S 表中的记录。最后,您可以在 DELETE 语句中使用 WHERE 子句来删除 SC 表中具有指定 sno 的记录。