¿Cómo restringir la cantidad de loggings permitidos en una tabla SQL?

Supongamos que tengo dos tablas, Padre e hijo. El padre tiene un campo MaxChildren (int) y Child tiene un campo Enabled (bit) y un campo ParentID (int) que enlaza con el logging principal.

Me gustaría tener una restricción tal que no puede haber más loggings de MaxChildren para cada padre donde Enabled = 1. Esto significaría que cualquier bash de insert o actualizar cualquier logging en la tabla Child fallará si pasa por encima del valor de MaxChildren aplicable, o cualquier bash de bajar a MaxChildren por debajo del número actual de loggings Child aplicables fallará.

Estoy usando MS SQL Server, pero espero que haya una forma estándar de SQL.

Esta es la syntax estándar de nivel de input de SQL-92, es decir, usa syntax 'vainilla' como keys externas y restricciones CHECK nivel de fila que están ampliamente implementadas en productos SQL (aunque notoriamente no mySQL):

 CREATE TABLE Parent ( ParentID INTEGER NOT NULL, MaxChildren INTEGER NOT NULL CHECK (MaxChildren > 0), UNIQUE (ParentID), UNIQUE (ParentID, MaxChildren) ); CREATE TABLE Child ( ParentID INTEGER NOT NULL, MaxChildren INTEGER NOT NULL, FOREIGN KEY (ParentID, MaxChildren) REFERENCES Parent (ParentID, MaxChildren) ON DELETE CASCADE ON UPDATE CASCADE, OccurrenceNumber INTEGER NOT NULL, CHECK (OccurrenceNumber BETWEEN 1 AND MaxChildren), UNIQUE (ParentID, OccurrenceNumber) ); 

Te sugiero que evites usar columnas de indicadores de bits. Por el contrario, podría tener una segunda tabla sin la restricción de MaxChildren luego implicaría la columna Habilitada en function de la tabla en la que aparece una fila. Probablemente desee tres tablas para modelar esto: una tabla de supertypes para todos los niños con tablas de subtypes para Habilitado . A continuación, puede crear una VIEW a UNION los dos subtypes con una columna Implicada implícita, por ej.

 CREATE TABLE Parents ( ParentID INTEGER NOT NULL, MaxChildren INTEGER NOT NULL CHECK (MaxChildren > 0), UNIQUE (ParentID), UNIQUE (ParentID, MaxChildren) ); CREATE TABLE Children ( ChildID INTEGER NOT NULL, ParentID INTEGER NOT NULL, MaxChildren INTEGER NOT NULL, FOREIGN KEY (ParentID, MaxChildren) REFERENCES Parents (ParentID, MaxChildren) ON DELETE CASCADE ON UPDATE CASCADE, UNIQUE (ChildID), UNIQUE (ChildID, MaxChildren), ); CREATE TABLE EnabledChildren ( ChildID INTEGER NOT NULL, MaxChildren INTEGER NOT NULL, FOREIGN KEY (ChildID, MaxChildren) REFERENCES Children (ChildID, MaxChildren) ON DELETE CASCADE ON UPDATE CASCADE, OccurrenceNumber INTEGER NOT NULL, CHECK (OccurrenceNumber BETWEEN 1 AND MaxChildren), UNIQUE (ChildID) ); CREATE VIEW AllChildren AS SELECT ChildID, 1 AS ENABLED FROM EnabledChildren UNION SELECT ChildID, 0 AS ENABLED FROM Children EXCEPT SELECT ChildID, 0 AS ENABLED FROM EnabledChildren;