Naši partneři
BMI SYSTEM CZECH
Informační systémy budoucnosti

Po migraci databáze uživatel nenalezen




Velmi často na svých cestách světem dostávám otázku, jak to, že po přenosu databáze mezi dvěma instancemi SQL Serveru pomocí příkazu BACKUP  "zmizí" uživatelské účty. Odpověď je jednoduchá, a řešení ještě jednodušší. Za všechno může bezpečnostní model MS SQL Serveru, který je postaven tak, že v databázi master jsou evidovány loginy uživatelů (login umožňuje přístup k instanci MS SQL, ale ještě není řečeno, že se tak uživatel podívá na nějaká data), a v uživatelské databázi jsou pak evidovány user accounts, které umožňují loginům právě "koukat na data" (po nastavení příslušných permissions). A právě user account má ve své "evidenci" uvedeno ID loginu, ke kterému patří.

 

User account se tedy z databáze neztratí, ale po přenosu databáze na novou instanci MS SQL nemá správně ID loginu. Možná to vypadá jako ukrutný bug, ale ono to není tak jednoduché. Mezi tabulkami, které jsou v různých databázích, nelze udělat cizí klíč, který by vazbu ohlídal.

 

Častý dotaz tedy zní: Co kruci s tím? První nápad (ale ne moc dobrý), je zrušit user account a znova jej vytvořit (pro rychlejší hledání v Books Online doporučuji CREATE USER, případně DROP USER, pro staromilce pak procedury sp_adduser a sp_dropuser, které se používaly na MS SQL 2000 a stále ještě existují). Nevýhodou tohoto postupu je fakt, že po zrušení a novém vytvoření user accountu (i když se stejným jménem) vzniká nový user account, a tedy je mu nutno znova nastavit všechna oprávnění pro pohyb v databázi, což může být tak klopotná práce, že se na ni admin radši vykašle (ale o tom, jak je každý user account členem db_owner zase jindy). Proto je třeba najít jiný postup, který permissions neporuší.

 

Výborným řešením je jednoduchý příkaz ALTER USER uživatel WITH LOGIN = 'login'. Tímto příkazem řekneme SQL Serveru, aby opravil ID loginu takříkajíc "per name", tedy na základě zadaných jmen user accountu a loginu. Pro ty, kteří spravují ještě i instance MS SQL Serveru 2000 bych doporučil ekvivalentní postup ještě z doby, kdy příkaz ALTER USER na SQL serveru nebyl - je to uložená procedura sp_change_users_login, která přijímá tři parametry - jméno loginu, jméno user accountu (to je v pohodě), a pak navíc nabízí třetí parametr - řetězec, který může nabývat hodnot "update one" (pro nápravu jedné vazby login - user account), nebo "auto fix", což je náprava všech uživatelských vazeb v dané databázi.

 
Sdílejte tuto položku se svými přáteli
 
Související články
TOPlist