关于删除级联错误 - 如何使用触发器解决它?

时间:2017-04-03 07:23:47

标签: sql sql-server

我在SQL Server 2012中创建一些表的查询如下:

app.use(expressjwt({credentialsRequired: true, secret: config.TOKEN_SECRET, requestProperty: 'user'}).unless({path: config.PUBLIC_URLs}));

app.use(function(err, req, res, next) {
    if(err.name === 'UnauthorizedError') {
      res.status(err.status).send({message:err.message});
      logger.error(err);
      return;
    }
 next();
});

,错误是

  

介绍FOREIGN KEY约束'FK__Poll_Vote__PollA__5A3A55A2'   表'Poll_Vote_Table'可能导致循环或多个级联路径。   指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他   FOREIGN KEY约束。   我怎么能解决这个问题

1 个答案:

答案 0 :(得分:1)

他们有很多方法可以解决您的问题。我只提出两个解决方案:

1-最简单的一个:将表Poll_Vote_Table更改为2表,一个用于问题,一个用于答案。

2-使用触发器而不是删除/更新。它实际上是你想要的,但请考虑解决方案1.现在使用触发器的代码(for reference):

(我只是说明问题部分。对于答案,它是相同的。)

首先,您必须重新创建您的FK,如下所示(删除后):

ALTER TABLE [dbo].[Poll_Vote_Table]  WITH CHECK 
ADD CONSTRAINT [FK_Vote_Question] FOREIGN KEY([PollQuestionId])
REFERENCES [dbo].[Poll_Question_Table] ([PollQuestionId])

然后你需要创建触发器:

CREATE TRIGGER [DELETE_Question_Vote]
   ON dbo.[Poll_Question_Table]
   INSTEAD OF DELETE
AS 
BEGIN
 SET NOCOUNT ON;
 DELETE FROM [Poll_Vote_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED)
 DELETE FROM [Poll_Question_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED)
END
GO

更新部分通常没用,所以我不会写它但它与DELETE基本相同。