Cosa accade se tento di eliminare un utente di database che sia owner di uno schema? Semplicemente mi viene impedito. Occorre, infatti, che prima elimini lo schema. Per far ciò serve che esso sia "vuoto", cioè che ad esso non appartenga nessun oggetto (tabella, stored procedure, etc..). Nel caso non sia vuoto, devo cancellare i suoi oggetti o trasferirli in un altro schema con l’istruzione T-SQL
E’ interessante notare il comportamento del Management Studio di SQL 2008 che, diversamente da SQL 2005, mostra una message-box che mi chiede se voglio prima eliminare gli schema dell’owner che sto cancellando.
Ma perchè un utente dovrebbe essere owner di uno schema? Questa è una tipica situazione che si riscontra in database migrati da SQL 2000, dove troviamo per ogni utente di database uno schema con lo stesso nome utente, il cui owner è appunto l’utente.
Posso, inoltre, incorrere in questa situazione anche con database creati con SQL 2005 / 2008, se utilizzo la (vecchia) stored procedure di sistema "sp_grantdbaccess" per mappare una login a uno user di database. Ad esempio:
GO
In tal caso, posso usare la "sp_revokedbaccess" per eliminare l’utente, senza dovermi preoccupare dello schema (sempre che questo sia vuoto). Ad esempio:
GO
Ricordo che con SQL 2005 sono state introdotte le istruzione T-SQL CREATE / DROP USER che sostituiscono rispettivamente sp_grantdbaccess / sp_revokedbaccess. Inoltre, la CREATE USER non implica la creazione di uno schema con lo stesso nome dell’utente, come invece avviene con la sp_grantdbaccess.
FOR LOGIN MicheleRossi
GO
DROP USER MicheleRossi
GO