donderdag 31 mei 2007

Restoren van 'in use' MSSQL database

Mocht je net zoals ik geregeld een SQL database moeten restoren, dan ken je wellicht het verschijnsel dat deze actie stopt met de volgende foutmelding: "Exclusive access could not be obtained because the database is in use".

Mijn standaard reactie op deze melding was het opvragen van de actieve users met sp_who en deze met het kill commando van de server trappen. Er zijn echter alternatieven om dit slimmer en sneller te doen.

Mijn eerste gedachte was om de systeem tabel sysprocesses op te vragen en vervolgens met een loopje de actieve processen te killen.Echter na enig zoekwerk op Google naar alternatieven kwam ik een betere oplossing tegen, namelijk het in single user mode zetten van de database. Hierdoor worden alle actieve users uitgelogd en kan de restore zonder problemen gestart worden. Helaas is deze oplossing pas beschikbaar vanaf SQL server 2000, maar eerdere versies zijn gelukkig een snel uitstervend ras.

De T-SQL opdracht gebruik ik voor het in single user mode zetten van een database:

ALTER DATABASE DbName SET SINGLE_USER WITH ROLLBACK IMMEDIATE

woensdag 23 mei 2007

Windows builtin groups gebruiken voor SQL server login

Zou je binnen SQL server een builtin group rechten willen geven om in te loggen, dan werkt dit niet via de Enterprise Manager. Je selecteert de groep en ziet in het venster MachineNaam\GroepNaam staan. Zodra je op OK klikt zul je de volgende foutmelding krijgen: "Windows NT user or group 'MachineNaam\GroepNaam' not found. Check the name again. (Microsoft SQL Server, Error: 15401)".

Dit blijkt een bug te zijn in de Enterprise Manager. Voor builtin groups kun je dus beter een sp_grantlogin opdracht geven in de Query Analyzer. De syntax voor deze opdracht is:

EXEC sp_grantlogin 'Builtin\GroepNaam'.