2016-02-02 12 views
0

Я ищу механизм базы данных, который может обрабатывать ограничения данных, указанные через RegEx. Поэтому в дополнение к типу данных я хочу иметь возможность управлять форматом данных. Например. a varchar(255) поле может быть дополнительно ограничено, чтобы быть как [a-zA-Z0-9 ].Есть ли механизм базы данных, который позволяет запрашивать ограничение поля, указанное RegEx?

Мне нужен RegEx, чтобы быть в курсе, поэтому я могу поделиться этими ограничениями во всей системе n-level, чтобы обеспечить соблюдение нескольких уровней. Например. MySQL позволяет запросить information_schema для получения метаданных, а другие механизмы базы данных имеют схожие способы.

Вчера я сделал сообщение (MySQL Queriable Field Constraint by RegEx), ссылаясь на вещи, которые я читал, но не выглядел многообещающим с MySQL, поэтому я открываю его для любого движка db, хотя я бы предпочел MS SQL, Oracle, DB2 или MySQL, так как будет легче продать бизнес.

Есть ли механизм базы данных, который позволяет использовать эти регулярные выражения? Если да, то какой из них и как ограничения устанавливаются и запрашиваются?

+0

Вы пробовали хоть немного исследований? Oracle имеет RegEx, сервер sql имеет ограниченный шаблон шаблона. Любой из них будет работать для вашего простого примера. –

+0

Ссылки на комментарии Шона ... MS SQL имеет ограниченную поддержку регулярных выражений (https://msdn.microsoft.com/en-us/library/ms179859.aspx), а оракул более обширен (https://docs.oracle. com/cd/B28359_01/appdev.111/b28424/adfns_regexp.htm) –

+0

Все еще смотрит в DB2 ... До сих пор похоже, что DB2 выполняет дикую карточку, такую ​​как MS SQL, и смотрит, поддерживают ли они что-то более глубокое (ссылка : http://stackoverflow.com/questions/19154453/how-to-write-a-query-to-ensure-email-contains) –

ответ

3

В Oracle вы можете указать пользовательский constraints, в котором вы можете использовать функции, которые оценивают regexp; например:

SQL> create table test_pattern (txt varchar2(1000)) 
    2/

Table created. 

SQL> alter table test_pattern add constraint check_pattern check (regexp_instr(txt, '^START') != 0) 
    2/

Table altered. 

SQL> insert into test_pattern values ('START a d f g ') 
    2/

1 row created. 

SQL> insert into test_pattern values ('_START a d f g ') 
    2/
insert into test_pattern values ('_START a d f g ') 
* 
ERROR at line 1: 
ORA-02290: check constraint (SIUINTEGRA.CHECK_PATTERN) violated 

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

select * 
from dba_constraints  
where table_name = 'TEST_PATTERN' 
+0

Каков результат ваших ограничений запрос? Также есть ли конкретная версия, которую я должен использовать, чтобы получить эту функциональность? –

+1

Он дает всю информацию об ограничениях (таблица, схема, если они отложены, откладываются, условие проверки, ...). Он работает на Oracle 10g и выше; предыдущие версии не поддерживают regexp – Aleksej

0

Вот подстановочные пример SQL-сервера для этого.

create table #Something 
(
    SomeValue varchar(255) 
    , constraint MyCheck CHECK (SomeValue like '[a-z][a-z][0-9]%') 
) 

insert #Something 
select 'ab3adoofnod' 
--(1 row(s) affected) 

insert #Something 
select 'a3b3adoofnod' 

Msg 547, Level 16, State 0, Line 1 
The INSERT statement conflicted with the CHECK constraint "MyCheck". The conflict occurred in database "tempdb", table "dbo.#Something__________________________________________________________________________________________________________0000000000DD", column 'SomeValue'. 
The statement has been terminated. 

Если вы хотите использовать некоторые T-SQL, чтобы просмотреть определение ваших проверочных ограничений вы можете использовать представление каталога sys.check_constraints.

Ниже приведен пример просмотра ВСЕХ проверочных ограничений для таблицы выше. Столбцы определения обеспечивают поиск подстановочных знаков, как определено в ограничении.

select * 
from tempdb.sys.check_constraints 
where parent_object_id = object_id('tempdb..#Something') 
+0

Как вы запрашиваете регулярное выражение в чеке? –

+0

Не уверен, что я следую вашему вопросу. Ограничение проверки говорит, что значение должно содержать 2 символа, за которыми следует номер. –

+0

Часть вопроса заключается в том, как запросить метаданные ограничения. В MySQL вы можете запросить таблицу 'information_schema', чтобы получить метаданные столбца. Как вы запрашиваете DBE MS SQL для получения метаданных '[a-z] [a-z] [0-9]%' этого столбца/поля? –