July 2006 Entries
டேட்டாபேசுடன் தனிமையில் ஆர அமர உட்கார்ந்து பேசவோ, ஒரேயடியாக அழிக்கவோ முயல நினைத்தால், சில நேரங்களில் இயலாமல் போகலாம். உதாரணத்திற்கு,DROP DATABAES <dbname>என்ற வினவலுக்கு Cannot drop the database <dbname> because it is currently in use.என்ற பிழைச்செய்தி வரலாம்.
இப்படிப்பட்ட நேரங்களில் நாம் எண்ணியதை முடிக்க ஒரே வழி, தகவல் தளக்கோப்புக்கும் வெளி உலகுக்குமான தொடர்பை ஒட்டுமொத்தமாகத் துண்டிப்பதுதான்.
ALTER DATABASE <dbname> SET SINGLE_USER
என்று வினவல் இதற்கு பயன்படும். அந்த கணத்தில் தொடர்பில் இருக்கும் பயனர்கள் தத்தமது நிலுவையில் இருக்கும் செயல்களை முடித்துக்கொண்ட பிறகு, <dbname> என்ற பெயருடைய டேட்டாபேஸ் ஒருமைப் பயனர் நிலைக்கு வந்துவிடும். ஒரு வலைத்தளம் அல்லது பலர் பயன்படுத்தும் மென்பொருளுக்கான தகவல்தளத்திற்கு இந்த வினவலே சரியாக இருக்கும்.
என்ன ஆனாலும் சரி, டேட்டாபேசை அழித்தே தீருவது என்ற முடிவுக்கு வந்துவிட்டால்,
ALTER DATABASE
<dbname>
SET SINGLE_USER
WITH ROLLBACK immediate
என்று வினவினால் போதும். அந்த நொடியே எல்லா பயனருடைய...
இன்று காலை நான் பணியகம் வந்ததும் ஒரு மென்பொருள் இயங்க மறுத்து சண்டித்தனம் செய்தது. மென்பொருளின் log file பார்த்ததும் SQL Server ப்ரச்சனை என்று புரிந்தது.
கடைசியில் பார்த்தால், அட ஆமாம். SQL Server அமைதியாக உறங்கிக் கொண்டிருந்தது. Administrative Tools->Services சென்று start பண்ணினால்
The MSSQLSERVER service on Local Computer started and then stopped. Som eservices stop automatically if they have no work to do, for example, the Performance Logs and Alerts service.
என்று ஒரே ஒரு தகவல்பெட்டி மட்டும் காண்பித்துவிட்டு மடக்கென்று படுத்துவிட்டது.
அப்புறமென்ன, Event Log தான் ஒரே வழி. நேரே Event viewer->Applicationக்கு ஒரு சுற்றுப்பயணம் மேற்கொண்டு பார்க்கும்படியான நிலமை. அங்கே ஒரு விஷயம் கிடைத்தது. ஒரு error log.
17204 :FCB::Open failed: Could not open device C:\Program Files\Microsoft SQL Server\MSSQL\Data\<dbname>_Log.LDF for...
ஒவ்வொரு ப்ரச்சனைக்கும் பல வழிகளில் தீர்வு காணலாம். சிலவை மிகச்சில நிரல்வரிகளே கொண்டிருக்கும். சில பேர் எழுதும் நிரல்களில் தேவையின்றி நிறைய நிரல்வரிகள் இருக்கும்.
உதாரணமாக, கீழ்க்கண்ட நிரல்வரிகளை Query Analyzerல போட்டு F5 விசையை அழுத்தி Messages சாளரத்தில் பாருங்கள்.
use masterdeclare @DbName varchar(1000)declare @DbFileName varchar(1000)declare cursormasters cursor for select name,filename from Sysdatabasesopen cursormastersfetch next from cursormasters into @DbName,@DbFileNamewhile @@fetch_status=0beginif(not @DbName='master')beginprint 'Deleting database file ''' + @DbFileName + '.MDF''.'print 'Deleting database file ''' + replace(@DbFileName,'.MDF','_LOG.LDF') + '''.'endelseprint 'Could not delete master database...'fetch next from cursormasters into @DbName,@DbFileNameendclose cursormastersdeallocate cursormasters
ஒன்றும் அதிர்ச்சியடையவில்லை தானே? இதே outputஐ வரவழைக்க வேறு சில சுலபமான வழிகளும் இருக்கிறதுதான்.
ஆனால், இரண்டு print statement கொடுப்பதற்குப் பதிலாக ஒரே ஒரு வரியிலேயே அந்த output வரவழைக்கலாமாமே? அது எப்படி என்று எனக்குத்...