English

How To: Re-synch SQL Server logins or users after restoring a database from backup

Summary

Instructions provided describe how to re-synch SQL Server logins with the database users after restoring a database from backup. This process is always required when an SDE schema database is restored from a backup (.bak), or attached from a previously detached database (.mdf). In these scenarios, the SDE user within the geodatabase is not in synch with the login for that instance of SQL Server.

If the SDE login is not added and synched with the user within that database, the connection will fail with Bad Login User or the service will not start.

Procedure

The stored procedure (SP_CHANGE_USERS_LOGIN) can be run to correct this problem by mapping an existing database user to their corresponding SQL Server login. This should be run against all databases in which the ‘SDE’ user needs access to manage the database. This also must be run for any SQL Server authenticated database users that own data. When starting the service, the ‘SDE’ user is the only user required.

  1. Ensure the SQL Server login associated with the database user has been added to the instance under Security > Logins, prior to running the sp_change_users_login stored procedure.
  2. Open a new query in SQL Server Management Studio and execute the following command:

    Code:

    use database_name
    go
    EXEC sp_change_users_login 'Update_One', 'sde', 'sde'
    go


    After the command is completed the following is reported:

    'The command(s) completed successfully.'
    MSDN: sp_change_users_login (Transact-SQL)
  3. Verify fix:
    Attempting to make a connection to the database or within ArcCatalog as the SDE or USER login verifies that the login and user are properly synched.

    The following queries can also be run to query the syslogins table in the master database and compare this with the sysusers table found within the individual user database. To verify if the SID columns match you may use the following query:

    Code:

    use master
    go
    select * from syslogins where name='sde'
    go

    use database_name
    go
    select * from sysusers where name='sde'
    go