SQL检查表列上的约束

时间:2013-05-02 21:10:12

标签: sql sql-server

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

 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的建议/解释之后,我能够把上面的内容放在一起,并且想要确定逻辑是否符合我的需要。再次感谢提前。

1 个答案:

答案 0 :(得分: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使用keyfile_path,以及任何其他上传模式(包括null),无论是否有keyfile_path