0

我有以下检查约束要添加到现有表中。

 ALTER TABLE  [dbo].[PROCESS_UPLOADDATA] 
ADD CONSTRAINT [PROCESS_RequireKeyFileOnMODE_Constraint] 
CHECK (
(RTRIM(LTRIM(LOWER(UPLOAD_MODE))) ='sftp' 
AND DATALENGTH(KEYFILE_PATH) > 2) 
)

UPLOAD_MODE 列是不允许 NULLS 且具有 ftp 或 sftp 等值的列。KEYFILE_PATH 列是一个 NVARCHAR(400) 列,默认设置为 IS NULL。但是,如果 UPLOAD_MODE 中的值设置为“sftp”,我想要确保还提供密钥文件路径。

ALTER TABLE 语句与 CHECK 约束“PROCESS_RequireKeyFileOnMODE_Constraint”冲突。冲突发生在数据库“FILECONTROL”、表“dbo.PROCESS_UPLOADDATA”中。

但是,当我执行时,我收到以下错误消息。请对此提供任何帮助。SQL SERVER 数据库!提前致谢。

//UPDATED SQL CHECK 


     ALTER TABLE  [dbo].[PROCESS_UPLOADDATA] 
    ADD CONSTRAINT [PROCESS_RequireKeyFileOnMODE_Constraint] 
    CHECK (
    CASE 
                     WHEN (RTRIM(LTRIM(LOWER(UPLOAD_MODE))) ='sftp' )
                        AND (DATALENGTH(KEYFILE_PATH) > 2) 
                       THEN 1 
                       WHEN   (RTRIM(LTRIM(LOWER(UPLOAD_MODE))) != 'sftp' )
                        AND (DATALENGTH(KEYFILE_PATH) < 2) 
                       THEN 1
                       WHEN   (RTRIM(LTRIM(LOWER(UPLOAD_MODE))) != 'sftp' )
                        AND ( KEYFILE_PATH IS NULL) 
                       THEN 1
                       ELSE   0

                       END =0
    )

在考虑了 Andomar 的建议/解释之后,我能够将上述内容放在一起,并想确定逻辑是否适合我在这里需要的内容。再次提前感谢。

4

1 回答 1

3

此检查要求所有条目是sftp

RTRIM(LTRIM(LOWER(UPLOAD_MODE))) ='sftp' AND DATALENGTH(KEYFILE_PATH) > 2

你可能的意思是:

RTRIM(LTRIM(LOWER(UPLOAD_MODE))) = 'sftp' AND DATALENGTH(KEYFILE_PATH) > 2
OR
RTRIM(LTRIM(LOWER(ISNULL(UPLOAD_MODE,''))) <> 'sftp'

这将允许sftp使用 akeyfile_path和任何其他上传模式(包括 null),无论是否带有keyfile_path.

于 2013-05-02T21:14:09.250 回答