Dit is op zich geen bezwaar als je een geroutineerde DBA'er bent, maar een reguliere beheerder wil bij het uitvoeren van SQL opdrachten nog wel eens vergeten om van tevoren een 'EXECUTE AS LOGIN' opdracht te geven om in het juiste schema terecht te komen.
Als oud-beheerder van Pre-SQL 2005 systemen wil mij dit ook nog wel eens overkomen, dus vroeg ik mij af of het mogelijk was om achteraf alle Virtual Center objecten naar het vertrouwde dbo schema te verplaatsen.
Na enig zoekwerk in de online documentatie van SQL server bleek dat met het commando 'ALTER SCHEMA' een object verhuisd kan worden. Maar hoe weet je nu welke objecten verhuisd moeten worden? Voor Virtual Center 2.5 databases heb ik proefondervindelijk vastgesteld dat dit alleen objecten zijn van het type USER_TABLE, SQL_STORED_PROCEDURE en VIEW.
Als ik dit vertaal naar een SQL query dan krijg je het volgende resultaat:
select 'ALTER SCHEMA dbo TRANSFER ' + '['+SCHEMA_NAME(schema_id)+'].['+name+']' FROM sys.objects (nolock)
where type_desc in ('USER_TABLE', 'SQL_STORED_PROCEDURE', 'VIEW')
and is_ms_shipped = 0
and schema_id = schema_id ('vul hier uw schemanaam in')
Waarschijnlijk kan het nog makkelijker, want feitelijk genereer ik hier alleen de commando's die aan SQL server gevoed moeten worden voor de daadwerkelijke verhuizing. Ik kan me voorstellen dat iemand die handiger is met SQL queries dit ook rechtstreeks kan.
Zodra alle objecten netjes zijn verhuisd naar het dbo schema, vergeet dan niet om met het commando 'ALTER USER' het standaard schema van de gebruiker op dbo te zetten. Na deze handeling kan de Virtual Center service weer worden gestart en zou alles naar behoren moeten werken.
Update 2 maart 2010: Het gebruik van schema's anders dan dbo zorgt ook voor problemen bij een upgrade van VI3 naar vSphere. Zie KB1011386 voor meer informatie.