Sql server 如何有条件地使SQL Server Flyway迁移脚本失败

Sql server 如何有条件地使SQL Server Flyway迁移脚本失败,sql-server,flyway,Sql Server,Flyway,我需要通过Flyway执行更新SQL。好的,update语句将成功执行,即使数据库表中不存在ITEM\u ID。如果未找到任何项目ID,我希望此迁移失败 我尝试的是: IF (SELECT COUNT(*) TABLE1 WHERE ITEM_ID IN (3, 5, 7)) != 3 BEGIN RAISERROR('Unexpected IDs. Aborting.', 20, -1) with log END GO update TABLE1 set FIELD1='AA' w

我需要通过Flyway执行更新SQL。好的,update语句将成功执行,即使数据库表中不存在
ITEM\u ID
。如果未找到任何
项目ID
,我希望此迁移失败

我尝试的是:

IF (SELECT COUNT(*) TABLE1 WHERE ITEM_ID IN (3, 5, 7)) != 3 
BEGIN
    RAISERROR('Unexpected IDs. Aborting.', 20, -1) with log
END
GO

update TABLE1 set FIELD1='AA' where ITEM_ID=3;
update TABLE1 set FIELD1='BB' where ITEM_ID=5;
update TABLE1 set FIELD1='CC' where ITEM_ID=7;
GO
raiserror
如果数据库用户不是管理员(我的案例),则它似乎不起作用

使用基于SQL Server的迁移有什么方法可以做到这一点吗

更新1:
raiserror
适用于严重级别11

IF (SELECT COUNT(*) TABLE1 WHERE ITEM_ID IN (3, 5, 7)) != 3 
BEGIN
    RAISERROR('Unexpected IDs. Aborting.', 11, -1)
END
GO
update TABLE1 set FIELD1='AA' where ITEM_ID=3;
update TABLE1 set FIELD1='BB' where ITEM_ID=5;
update TABLE1 set FIELD1='CC' where ITEM_ID=7;
GO

有更好的主意吗?

RAISERROR
适用于所有人,但如果您使用severity 20(它需要
和日志
,而这反过来又需要系统管理员权限),则不适用。使用严重性11,这足以向调用者返回错误,并
将NOEXEC设置为ON
以强制脚本的其余部分不执行。我检查了。如果不启用
设置NOEXEC,它似乎可以工作。
打开NOEXEC的目的是什么?它是否会使脚本执行成功(这将使Flyway将此迁移标记为成功,这不是我想要的)?
SET NOEXEC ON
的目的是。(
SET PARSEONLY ON
甚至比这更保守,因为它甚至不编译任何东西。)实际上,它是T-SQL的“停止做任何事情”标志。我不知道Flyway做什么;我希望引起错误的脚本足以将其标记为不成功。