gpt4 book ai didi

SQL 触发器不能执行 INSTEAD OF DELETE,但对于 ntext、image 列是必需的

转载 作者:行者123 更新时间:2023-12-03 01:22:47 27 4
gpt4 key购买 nike

CREATE TRIGGER [dbo].[C1_Deletions] ON [dbo].[C1] INSTEAD OF DELETE AS
SET NOCOUNT ON
IF EXISTS ( SELECT 'True' FROM deleted JOIN C1 ON deleted.ACCOUNTNO = C1.ACCOUNTNO )
BEGIN
INSERT INTO [GDeletions].[dbo].[C1] SELECT * FROM deleted
DELETE C1 FROM C1 INNER JOIN DELETED ON C1.ACCOUNTNO = DELETED.ACCOUNTNO
END

这就是我尝试使用的触发器,当我通过 accountno 删除时它效果很好,但是当我需要通过 reci(另一列)删除时我无法这样做。

如果我将 INSTEAD OF 更改为 AFTER,我会收到有关 ntext、image 列不允许的错误。有什么办法可以解决这个问题吗?我不能是指定删除字符串的人,程序本身就是这样做的,我只需要触发器来获取正在删除的数据。

我遇到的更大问题是另一个存储历史记录的表,它存储它的accountno与c1表匹配,但还有recid,它对每个条目都是唯一的。如果我要删除 C1 条目,它会使用 accountno 从历史记录中删除所有条目,但如果我删除单个历史条目,则会通过 recid 删除。

最佳答案

您无法从 INSERTED 或 DELETED 访问 TEXT、NTEXT 或 IMAGE 字段。但是,您可以通过连接 INSERTED 从基表访问它们。这仅适用于 INSERT 和 UPDATE,因为在 DELETE 中基行不再存在。

要实现您的需要,请在另一个触发器中将主键以及 TEXT、NTEXT 和 IMAGE 列复制到侧表。

例如

create table C1(
accountNo int identity primary key,
someColumn nvarchar(10),
someNtext ntext
)

create table C1_side(
accountNo int primary key,
someNtext ntext
)

create trigger trgC1_IU on C1 AFTER INSERT, UPDATE
as
BEGIN
-- Ensure side row exists
insert C1_side(accountNo, someNtext)
select accountNo from INSERTEd
where not exists (select 1 from C1_side where C1_side.accountNo = inserted.accountNo)

-- Copy NTEXT value to side row
update C1_side
set someNtext = c1.someNtext
from C1_side inner join C1 on C1_side.accountNo = C1.accountNo
inner join INSERTED on INSERTED.accountNo = C1.accountNo
-- Could improve by checking if the column was updated for efficiency

END

现在,在 DELETE 触发器中,您可以将 DELETED 连接到 C1_side 以读取 ntext 列的先前值。请注意,您必须为侧表填充 C1 中已存在的行的初始值。

关于SQL 触发器不能执行 INSTEAD OF DELETE,但对于 ntext、image 列是必需的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9101924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com