Повторное использование контрольных ограничений - PullRequest
2 голосов
/ 31 августа 2010

Если в SQL Server есть столбцы, которые должны иметь одинаковый тип данных, можно ли определить проверочное ограничение на таблице (или уровне базы данных) и применить его к столбцу при его определении?

Как в этом (надуманном) примере:

ALTER TABLE dbo.tblAuditTrail
ADD CONSTRAINT CK_DecimalNumber
CHECK (DecimalColumn LIKE '^\-?\d+\.\d+$')
GO

Как теперь вы можете связать это с одним или несколькими столбцами, создавшими его на уровне таблицы, или ответом на это является использование RULE, а именно.

CREATE RULE RU_Decimal
AS
@value LIKE '^\-?\d+\.\d+$'
GO

Я знаю, что пример придуман, и можно использовать десятичный столбец для десятичных значений, но предположим, что из-за неправильного выбора дизайна это был столбец nchar, и вы хотели применить к нему некоторые ограничения.

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Хотя правила соответствуют вашим требованиям, теперь они устарели в пользу простых старых проверочных ограничений. Не рекомендуется использовать правила, если вы считаете, что базу данных, возможно, придется перенести в будущие версии SQL Server. См. «Важное» сообщение в верхней части документации MSDN: http://msdn.microsoft.com/en-us/library/ms188064.aspx.

Вы можете получить некоторое повторное использование, используя пользовательскую функцию, и вызывать ее во всех проверочных ограничениях, но вам все равно потребуется явно определить проверочные ограничения для всех столбцов, к которым она применяется.

CREATE FUNCTION IsDecimal(@input varchar(max))
RETURNS bit
AS 
BEGIN
    IF @value LIKE '^\-?\d+\.\d+$'
        RETURN 1
    ELSE
        RETURN 0
END
GO 

ALTER TABLE dbo.tblAuditTrail     
    ADD CONSTRAINT CK_DecimalNumber     
    CHECK (dbo.IsDecimal(DecimalColumn) = 1)     
GO
1 голос
/ 31 августа 2010

Ваше ограничение является ограничением типа.

С SQL вы можете справиться с этой ситуацией через определяемые пользователем типы, где ваше «повторное использование» материализуется путем объявления нескольких столбцов этого типа,

или вы должны повторить ограничение типа как ограничение CHECK для каждого отдельного столбца.

...