最近因為無法確認 AP 端問題在哪,導致必須在 SQL Server 上建立條件約束來避免異常資料存進來,就順道整理條件約束相關內容
USE tempdb
GO
-- 判斷資料表是否存在
DROP TABLE IF Exists Temp
-- 建立 Temp Table
CREATE TABLE Temp (StartDate Date , EndDate Date)
-- 假設該資料表和欄位已存在,要加上 Check 條件約束
ALTER TABLE Temp
ADD CONSTRAINT CK_DateCompare CHECK (StartDate < EndDate );
-- 建立錯誤資料
INSERT INTO Temp (StartDate , EndDate) VALUES('20180919','20180901')
INSERT 陳述式與 CHECK 條件約束 "CK_DateCompare" 衝突。衝突發生在資料庫 "tempdb",資料表 "dbo.Temp"。
無法直接利用 TSQL 語法修改 Check 條件約束,必須先刪除再新增
-- 刪除 Check 條件
ALTER TABLE Temp
DROP CONSTRAINT CK_DateCompare
-- 再建立新的條件約束
ALTER TABLE Temp
ADD CONSTRAINT CK_DateCompare CHECK (StartDate <= EndDate);
-- 使用 INSERT 與 UPDATE 陳述式停用檢查條件約束
ALTER TABLE Temp NOCHECK CONSTRAINT CK_DateCompare
--
-- 啟用:
-- 於 INSERT 或 UPDATE 時強制套用:是
-- 檢查建立或重新啟用時的現有資料:否
ALTER TABLE Temp CHECK CONSTRAINT CK_DateCompare
-- 啟用:
-- 於 INSERT 或 UPDATE 時強制套用:是
-- 檢查建立或重新啟用時的現有資料:是
ALTER TABLE Temp WITH CHECK CHECK CONSTRAINT CK_DateCompare
SELECT
s.[name] AS ScheamName ,
o.[name] AS TableName ,
i.[name] AS CheckName ,
i.definition ,
i.type_desc ,
i.create_date ,
i.modify_date ,
i.is_disabled ,
i.is_not_for_replication ,
i.is_not_trusted
FROM sys.check_constraints i
INNER JOIN sys.objects o ON i.parent_object_id = o.[object_id]
INNER JOIN sys.schemas s ON o.[schema_id] = s.[schema_id]
GO
沒有留言:
張貼留言