Labels

admin (1) aix (1) alert (1) always-on (2) Architecture (1) aws (3) Azure (1) backup (3) BI-DWH (10) Binary (3) Boolean (1) C# (1) cache (1) casting (3) cdc (1) certificate (1) checks (1) cloud (3) cluster (1) cmd (7) collation (1) columns (1) compilation (1) configurations (7) Connection-String (2) connections (6) constraint (6) copypaste (2) cpu (2) csv (3) CTE (1) data-types (1) datetime (23) db (547) DB2 (1) deadlock (2) Denali (7) device (6) dotNet (5) dynamicSQL (11) email (5) encoding (1) encryption (4) errors (124) excel (1) ExecutionPlan (10) extended events (1) files (7) FIPS (1) foreign key (1) fragmentation (1) functions (1) GCP (2) gMSA (2) google (2) HADR (1) hashing (3) in-memory (1) index (3) indexedViews (2) insert (3) install (10) IO (1) isql (6) javascript (1) jobs (11) join (2) LDAP (2) LinkedServers (8) Linux (15) log (6) login (1) maintenance (3) mariadb (1) memory (4) merge (3) monitoring (4) MSA (2) mssql (444) mssql2005 (5) mssql2008R2 (20) mssql2012 (2) mysql (36) MySQL Shell (5) network (1) NoSQL (1) null (2) numeric (9) object-oriented (1) offline (1) openssl (1) Operating System (4) oracle (7) ORDBMS (1) ordering (2) Outer Apply (1) Outlook (1) page (1) parameters (2) partition (1) password (1) Performance (103) permissions (10) pivot (3) PLE (1) port (4) PostgreSQL (14) profiler (1) RDS (3) read (1) Replication (12) restore (4) root (1) RPO (1) RTO (1) SAP ASE (48) SAP RS (20) SCC (4) scema (1) script (8) security (10) segment (1) server (1) service broker (2) services (4) settings (75) SQL (74) SSAS (1) SSIS (19) SSL (8) SSMS (4) SSRS (6) storage (1) String (35) sybase (57) telnet (2) tempdb (1) Theory (2) tips (120) tools (3) training (1) transaction (6) trigger (2) Tuple (2) TVP (1) unix (8) users (3) vb.net (4) versioning (1) windows (14) xml (10) XSD (1) zip (1)

Check constraint on a column value for each ID in the table

Our goal: to check in the DB level that for each ID (or other column) will be other column with a specific value not more than one time.

Wow - long statement… Let's do it with an example :)

CREATE TABLE [dbo].[SpecialCheckConst]
(      SomeID int,
       SomeStatusID int, -- we will check vaalues of this column
       SomeOtherColumn nvarchar(50) -- or any other columns
)

We want to check that for each SomeID there is no more than one record of SomeStatusID 1.

INSERT INTO dbo.SpecialCheckConst
       (      SomeID, SomeStatusID, SomeOtherColumn)
       VALUES
       (      2, 3, 'aaa'), (5, 1, 'sss')

When we will try to insert new record with SomeStatusID 1 for SomeID 2 - we should success.
When we will try to insert new record with SomeStatusID 1 for SomeID 5 - we should fail (because there is a record for this SomeID with status 1).
When we will try to insert new record with new SomeID - of course that SomeStatusID 1 is OK.

Solution
CHECK CONSTRAINT that calls a function that count the number of SomeStatusID 1 for the SomeID:

CREATE FUNCTION [dbo].[fn_SpecialCheckConst_SomeStatusIDOne]
(
       @SomeID int
)
RETURNS INT
AS
BEGIN
       DECLARE @SomeStatusIDOne int

       SELECT @SomeStatusIDOne = COUNT(*)
       FROM dbo.SpecialCheckConst
       WHERE SomeID = @SomeID
       AND SomeStatusID = 1

       RETURN @SomeStatusIDOne
END

GO
---------------------------------------------------------------------------------------------
ALTER TABLE [dbo].[SpecialCheckConst]  WITH CHECK ADD  CONSTRAINT [CHK_dbo_SpecialCheckConst_SomeStatusIDOne]
CHECK  (NOT ([dbo].[fn_SpecialCheckConst_SomeStatusIDOne](@SomeID) > 1 AND SomeStatusID = 1))
GO
ALTER TABLE [dbo].[SpecialCheckConst] CHECK CONSTRAINT [CHK_dbo_SpecialCheckConst_SomeStatusIDOne]
GO
---------------------------------------------------------------------------------------------

And ….. It’s work!

You can drop the example temp table:
--DROP TABLE dbo.SpecialCheckConst
--go

No comments:

Post a Comment