Ограничения проверяются в db2, где имя пользователя может иметь только a-z или _ и определенную длину

Мне нужно написать ограничение в db2, где имя пользователя должно начинаться с @, за которым следует буквенно-цифровой шаблон, может иметь максимальную длину 31 и может содержать только строчные буквы, цифры и символ _ (подчеркивание). Я сделал это:

ALTER  TABLE KUNDENKONTAKTDATEN ADD CONSTRAINT
  TwitterID_CHECK CHECK ( trim(length(TWITTER_ID)) <= 31 AND TWITTER_ID like '@%')

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

Это мой домашний вопрос, и советы заключались в том, чтобы использовать такие функции, как Trim, Translate, Length и Substr, но мне разрешено использовать другие функции. Интернет сказал мне использовать функцию fn:matches, но я не уверен, как она работает.

Может ли кто-нибудь помочь мне решить эту проблему с использованием fn:matches или без него?

заранее спасибо

Изменить: на самом деле это не дубликат this, но можно применить аналогичный метод. чтобы проверить, содержит ли он недопустимое значение. Этот вопрос касается не только определения того, содержит ли столбец специальные символы. Уникальными частями моего вопроса являются: длина, начиная с, не определяя, есть ли у нее специальный символ, но допуская только один специальный символ (_) в качестве значения и, следовательно, не дубликат.


person MessitÖzil    schedule 26.05.2016    source источник
comment
СОВЕТ: если вы переведете все разрешенные символы в пробел, а затем посмотрите, есть ли символы, отличные от пробела, вы узнаете, что он содержит недопустимые символы.   -  person Hogan    schedule 26.05.2016
comment
в качестве примечания: НЕВЕРОЯТНО ГЛУПЫЙ И ПЛОХОЙ ДИЗАЙН помещать такие бизнес-правила только как ограничения в поле базы данных. Я рекомендую попросить вашего профессора объяснить, почему я сказал бы это, если вы еще не знаете. Понимание этого гораздо важнее, чем возможность закодировать ограничение или выполнить поиск в Google по многоуровневой архитектуре.   -  person Hogan    schedule 26.05.2016
comment
Возможный дубликат Как найти специальные символы в DB2?   -  person mustaccio    schedule 26.05.2016


Ответы (1)


Наконец это решило проблему.

ALTER TABLE KUNDENKONTAKTDATEN
ADD CONSTRAINT
TwitterID_CHECK CHECK (trim(length(TWITTER_ID)) <= 31 AND TWITTER_ID LIKE '@%' 
AND LENGTH(TRIM(TRANSLATE(TWITTER_ID, ' ',
'abcdefghijklmnopqrstuvwxyz0123456789_@'))) = 0)

Благодаря @Hogan и @mustaccio

person MessitÖzil    schedule 26.05.2016