Usualmente è consigliabile evitare di usare il metodo Copia – Incolla per installare un Database SQL da un cliente. Però è comodo :).
Questa comodità, se non si presta un po’ di attenzione copiando e svuotando il DB di prova su cui abbiamo fatto tutti i test e i pastrocchi in fase di sviluppo, può portare ad alcuni fastidiosi problemi. Ne affronto uno molto comune.
Nel Server SQL di sviluppo ho mappato degli utenti di test, alcuni sono Utenti Windows, altri sono Utenti SQL con diversi tipi di permessi per fare i test di accesso ai vari oggetti del DB.
Ovviamente, sul server in Produzione presso il cliente i miei utenti di dominio certamente non esistono come pure non esistono gli utenti SQL che ho creato appositamente.
Copiando ed incollando il DB di Sviluppo sul Server di Produzione, ottengo che il Database ha una serie di Utenti mappati che non hanno un login corrispondente sul Server.
Se provo a cancellarli, usualmente posso farlo e quindi il problema si risolve da Sql management studio oppure con una DROP USER, se però come ho fatto io, l’utente DB per qualche strano esperimento è proprietario di uno SCHEMA sul database, ancorché detto SCHEMA non contenga oggetti. La cancellazione darà errore. Ecco alcuni utili comandi TSQL Per risolvere i problemi di questo tipo:
-- Per Assegnare un Login valido ad un Utente il cui Login -- non esiste sul nuovo server USE [MyDb] GO ALTER USER MyUser WITH LOGIN = SqlLogin; GO -- Il Login nuovo può essere un login SQL oppure Windows -- (Assumo che tutti sappiate la differenza fra Login di -- SQL Server e User del Database). -- Per spostare la proprietà di uno schema da un utente ad -- un altro (io nell'esempio ho dato l'ownership al DBO ma -- potrebbe anche essere un utente diverso del DB. USE [MyDb] GO ALTER AUTHORIZATION ON SCHEMA::MySchema TO dbo; GO -- Per eliminare l'utente dopo averlo dotato di un login -- ed avergli tolto la proprietà di qualsivoglia schema USE [MyDb] GO DROP USER MyUser GO
ALTER USER possiede altre opzioni piuttosto utili per modificare le caratteristiche dell’utente del DB, perciò fate un giro sui Books Online di SQL Server.