தகவல்தளத்தினுள் தவறான தகவல் சேர்ந்துவிடாமல் இருக்க database constraints உதவுகிறது. தகவல் சீர்மைக்கு constraint இன்றியமையாதது. இந்த கன்ஸ்ட்ரைண்டில் பல வகைகள் உள்ளன. உதாரணமாக default value constraint (காலியான தகவல் இருப்பதை அனுமதிக்க/மறுக்க), foreign key constraint (மற்ற டேபிள்களுடன் எந்த விட தொடர்பும் இல்லாத தகவல்களை நிராகரிக்க), check constraint (நாம் குறிப்பிடும் சில நிபந்தனைகளுக்கு உட்படும் தகவலை மட்டும் அனுமதிக்க) போன்றவை.
`Check constraint கொஞ்சம் flexible ஆனது. நாம் விரும்பும் data validation எல்லாவற்றையும் ஒவ்வொரு fieldக்கும் வைக்கலாம்.
எடுத்துக்காட்டாக, ஒரு தமிழ் வலைப்பதிவு மென்பொருளை உருவாக்குவதாக வைத்துக்கொள்வோம். இந்த மென்பொருளில் ஒரு கண்டிஷன் வைக்கலாம். வலைப்பதிவின் தலைப்பு கண்டிப்பாகத் தமிழில்தான் இருக்கவேண்டும். எதற்கு இப்படி ஒரு வெட்டிவேலை என்று நினைக்கத்தோன்ற்கிறதா? நல்ல கேள்வி. அத்ற்கு விடை இந்தப்பதிவின் கடைசியில் சொல்கிறேன்.
அப்ளிகேஷன் அளவில் இதற்கு ஒரு நிபந்தனையை அமைத்து தகவல் உள்ளீட்டு நிலையிலேயே ஆங்கில எழுத்துக்கள் உள்ள தலைப்பைக் கட்டுப்படுத்திவிடலாம். ASP.NET regular expression validation control ஒன்றே இதற்குப் போதுமானது. அப்ளிகேஷன் சொதப்பினால் கூட, டேட்டாபேசில் தவறான தகவல் இடம்பெற்றுவிடக்கூடாது என்றால் அதற்கு ஒரு check constraint பயன்படுத்தலாம்.
கீழ்க்கண்டவாறு டேபிள் structure இருக்கிறது என்று வைத்துக்கொள்வோம்:
Table Name: TamilPosts
| Column Name |
Data Type |
| blogid |
int |
| PostTitle |
nvarchar(1000) |
| PostContent |
nvarchar(4000) |
இந்த டேபிளுக்கு PostTitle fieldல் ஆங்கில எழுத்துக்கள் இடம்பெறக்கூடாது.
ஆங்கில எழுத்து, தமிழ் எழுத்து என்பதை எல்லாம் கண்டறிய SQL Serverல் ஃபங்க்ஷன் கிடையாது. எனவே, முதலில் இதை எழுதலாம். இப்படி:
CREATE FUNCTION [dbo].[HasEnglishLetters]
(
-- Add the parameters for the function here
@PostTitle nvarchar(1000)
)
RETURNS bit
AS
BEGIN
Declare @HasEnglishContentbit
select @HasEnglishContent =case when @PostTitle like '%[a-z]%' then 1else 0end
-- Return the result of the function
RETURN @HasEnglishContent
END
மேலே உள்ள ஃபங்க்ஷன் ஒரு எழுத்துச்சரத்தை எடுத்துக்கொண்டு, அதில் ஆங்கில எழுத்துக்கள் கலந்து இருக்கிறதா இல்லையா என்பதைத் தெரிவிக்கும். ஆங்கில எழுத்துக்கள் இருக்கிறது என்றால் 1 என்றும், இல்லை என்றால் 0 என்றும் இந்த ஃபங்க்ஷன் தெரிவிக்கும்.
இந்த ஃபங்க்ஷனை இப்பொழுது ஒரு check constraint-ஆக நம்முடைய டேபிளில் இணைக்கவேண்டும். அதற்கு கீழ்க்கண்ட SQL DDLஐப் பயன்படுத்தலாம்;:
ALTER TABLE [dbo].[TamilPosts] WITH CHECK
ADD CONSTRAINT [CK_TamilPostTitle] CHECK
(([dbo].[HasEnglishLetters]([PostTitle])=(0)))
GO
ALTER TABLE [dbo].[TamilPosts] CHECK CONSTRAINT [CK_TamilPostTitle]
அல்லது, நேராக டேபிளின் டிசைன் வ்யூவுக்குச் சென்று, ஏதாவது ஒரு காலத்தின் மேல் வலது க்ளிக் செய்து Check Constraints… மெனுவைத் தேர்ந்தெடுக்கவேண்டும். பிறகு வரும் Check Constraints சாளரத்தில், Expression ப்ராப்பர்டியில் ([dbo].[HasEnglishLetters]([PostTitle])=(0)) என்று கொடுக்கவேண்டும். இதற்கான காட்சித்திரை:
இனிமேல் ஆங்கில எழுத்துள்ள தலைப்பை உள்ளிட்டால், “தூ தூ” என்று கீழ்க்கண்டவாறு துப்பும். முயற்சிப்போமா?
insert into tamilposts values(1, 'test', 'test content')
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK_TamilPosts". The conflict occurred in database "pullivalai", table "dbo.TamilPosts", column 'PostTitle'.
The statement has been terminated.
இந்த பிழைச்செய்தியின் அடிப்படையில் முன்முகப்பு நிரலிலும் பயனர்ச்சொல்லில் பிழையை அறிவிக்கலாம்.
தமிழில்தான் வலைப்பதிவின் தலைப்பு இருக்கவேண்டும் என்பதாக எதற்கு ஒரு மென்பொருள் இருக்கவேண்டும் என்று கேட்பவர்களுக்கு ... அது. .. வந்துங்க .. பிற்காலத்தில் இந்த மென்பொருளில் இட்ட பதிவைப் பார்த்து ஒரு படமெடுத்தால், அந்த திரைப்படத்திற்குத் தமிழில் பெயர் வைப்பது சுலபம், இல்லையா?
ஆங்கிலச்சொற்கலைத் தமிழில் எழுதினால் அதை இந்த check constraint வைத்து எப்படி தடுக்க முடியும் என்று நினைக்கத்தோன்ற்கிறதா? நல்ல கேள்வி. அதற்கு விடை இந்தப்பதிவின்.... ச்சே! வேண்டாம். என்னுடைய மொக்கை எனக்கே சகிக்கவில்லை. இத்துடன் உங்களுக்கு விடுதலை.