Check Constraint mit "sprechender" Fehlermeldung

30/10/2009 - 09:17 von Rainer Venema | Report spam
Hallo NG,

ich möchte gerne Check Constraints in der DAtenbank anlegen, um schon
auf dieser Ebene die Konsistenz der Daten zu überprüfen - logisch...

Unschön finde ich nur, dass es mir bislang nicht gelungen ist, auf
Seite der Applikation auch eine Fehlermeldung zu sehen, die dem
unbedarften Beutzer auch etwas sagt. Die Fehlermeldung, die ich über
ODBC etc. bekomme, erzàhlt zwar ausführlich, in welcher Tabele welche
Constraint (also der Name) verletzt ist, was aber wirklich dahinter
steckt, erfàhrt der Benutzer nicht.

Konkret, die folgende Constraint:
ALTER TABLE [dbo].[Table_1] WITH CHECK ADD CONSTRAINT [CK_Table_1]
CHECK (([num]>=(1) AND [num]<=(5)))

EXEC sys.sp_addextendedproperty @name=N'MS_Description',
@value=N'''num'' muss zwischen 1 und 5 liegen' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'Table_1',
@level2type=N'CONSTRAINT',@level2name=N'CK_Table_1'

Wenn ich versuche, den Wert 6 einzugeben, erhalte ich sowas wie
Die UPDATE-Anweisung steht in Konflikt mit der CHECK-Einschrànkung
'CK_Table_1'. Der Konflikt trat in der 'Test'-Datenbank, Tabelle
'Table_1', column 'Num' auf.

Lieber hàtte ich aber sowas wie
''num'' muss zwischen 1 und 5 liegen

Geht das?

Gruß, Rainer
 

Lesen sie die antworten

#1 Christoph Ingenhaag
30/10/2009 - 10:03 | Warnen spam
Hallo Rainer,

http://msdn.microsoft.com/en-us/lib...90243.aspx
"Using Input Mask vs. CHECK Constraints
...
The advantage of the input mask over the CHECK constraint is that the logic
is applied in the applications. These can generate more informative errors
if a user provides data that is incorrectly formatted. The disadvantage of
the input mask is that it requires a separate call to
fn_listextendedproperty or sys.extended_properties to obtain the property,
and the logic to enforce the mask must be added in all programs."
...

daraus schließe ich, dass das was du mit den extended porperties vorhast,
wenn überhaupt über eine Input Mask ginge und diese in alle auf die
Datenbank zugreifende Programme hinzugefügt werden müsste.

Man könnte sich aber so etwas was du möchtest, so hinbasteln:

begin try drop table test_chk end try begin catch end catch

create table test_chk(id int, num int, constraint chk check (num between 1
and 5))

insert into test_chk select 1, 1

declare @error varchar(max)
begin try
insert into test_chk select 1, 7
end try
begin catch
if error_number() = 547
begin

select
@error = '[num] muss folgender Bedingung genügen:' +
CHECK_CLAUSE
from INFORMATION_SCHEMA.CHECK_CONSTRAINTS
where
CONSTRAINT_CATALOG = 'test' and
CONSTRAINT_SCHEMA = 'dbo' and
CONSTRAINT_NAME = 'chk'

raiserror(@error, 16, 1)
end
end catch

Viele Grüße
Christoph



"Rainer Venema" schrieb im Newsbeitrag
news:
Hallo NG,

ich möchte gerne Check Constraints in der DAtenbank anlegen, um schon
auf dieser Ebene die Konsistenz der Daten zu überprüfen - logisch...

Unschön finde ich nur, dass es mir bislang nicht gelungen ist, auf
Seite der Applikation auch eine Fehlermeldung zu sehen, die dem
unbedarften Beutzer auch etwas sagt. Die Fehlermeldung, die ich über
ODBC etc. bekomme, erzàhlt zwar ausführlich, in welcher Tabele welche
Constraint (also der Name) verletzt ist, was aber wirklich dahinter
steckt, erfàhrt der Benutzer nicht.

Konkret, die folgende Constraint:
ALTER TABLE [dbo].[Table_1] WITH CHECK ADD CONSTRAINT [CK_Table_1]
CHECK (([num]>=(1) AND [num]<=(5)))

EXEC sys.sp_addextendedproperty @name=N'MS_Description',
@value=N'''num'' muss zwischen 1 und 5 liegen' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'Table_1',
@level2type=N'CONSTRAINT',@level2name=N'CK_Table_1'

Wenn ich versuche, den Wert 6 einzugeben, erhalte ich sowas wie
Die UPDATE-Anweisung steht in Konflikt mit der CHECK-Einschrànkung
'CK_Table_1'. Der Konflikt trat in der 'Test'-Datenbank, Tabelle
'Table_1', column 'Num' auf.

Lieber hàtte ich aber sowas wie
''num'' muss zwischen 1 und 5 liegen

Geht das?

Gruß, Rainer

Ähnliche fragen