SQL Serverは、制約をチェックするときに正規表現をサポートしています;トリガーは常に必要ではありません

誰かがこの質問をしました:


コード列を持つグループテーブルを作成する必要があります。 アルファベット文字(D、M、O、P、またはT)の後に2つの数字のみを許可する列制限を追加することは可能ですか?

彼らは彼に答えた:


通常の方法でこれを行うことはできません-MS SQL Serverは制約チェックをサポートしますが、INTの最小/最大値、行の長さなどの形式でのみサポートします。 必要なのは、SQL Serverがサポートしていない正規表現チェックです。 理論的には、.NET挿入を行い、それをSQL Serverに展開し、簡単なタスクではなく、そのようなチェックを使用するように強制できます。

それを理解してみましょう


SQLサーバーは正規表現を完全にはサポートしていないという事実にもかかわらず、上記のタスクはT-SQLで問題なく解決できます。 これは、この正規表現の外観です。

[DMOPT][0-9][0-9]

アルファベット文字(D、M、O、P、またはT)の後に2つの数字が続く場合のみ使用できます。 さて、十分に話をして、コードを見てみましょう。

テーブルを作成する

 CREATE TABLE blatest(code char(3)) 

制限チェックを追加

 ALTER TABLE blatest ADD CONSTRAINT ck_bla CHECK (code like '[DMOPT][0-9][0-9]' ) GO 

データを挿入するためのいくつかの手順

 INSERT blatest VALUES('a12') --  INSERT blatest VALUES('M12') --  INSERT blatest VALUES('D12') --  INSERT blatest VALUES('DA1') --  

ご覧のとおり、エラーメッセージが2回表示されました
547, 16, 0, 1
INSERT CHECK "ck_bla". "Test", "dbo.blatest", 'code'.
.


d12ではなくD12を挿入する場合、つまり 大文字と小文字の区別が必要な場合は、このような制限を作成する必要があります

 (code like '[DMOPT][0-9][0-9]' COLLATE SQL_Latin1_General_CP1_CS_AS ) 

変更する必要があるのは、照合パラメーターSQL_Latin1_General_CP1_CS_ASを追加することだけでした。

このパラメーターが提供するものを確認するには、次のクエリを実行します

 SELECT * FROM ::fn_helpcollations() WHERE name = 'SQL_Latin1_General_CP1_CS_AS' 

説明でリクエストが返したものは次のとおりです

Latin1-General, case-sensitive, accent-sensitive, kanatype-
insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 51 on Code Page 1252 for non-Unicode Data


新しい制約を作成しましょうが、最初に古い制約を削除する必要があります

 ALTER TABLE blatest DROP CONSTRAINt ck_bla GO 

次に、新しいものを作成して確認します

 ALTER TABLE blatest ADD CONSTRAINT ck_bla CHECK (code LIKE '[DMOPT][0-9][0-9]' COLLATE SQL_Latin1_General_CP1_CS_AS ) GO INSERT blatest VALUES('D12') --  INSERT blatest VALUES('d12') --  

D12の値の挿入は成功しますが、d12は失敗します。
ご覧のとおり、制約で正規表現を使用することは可能で、この場合トリガーは不要です。

Source: https://habr.com/ru/post/J340822/


All Articles