# 備份還原MS-SQL Database後無法登入
###### tags: `Microsoft` `SQL` `MSSQL`
```graphviz
digraph {
node [color=black, fontname=Arial, shape=record]
com1 [label="{<f0>Computer 1|<f1>Database 1}"];
com2 [label="{<f0>Computer 2|<f1>Database 2}"];
com1->"備份"->"還原"->com2
}
```
## 方法一、把 Computer 1 的 Database 1 的 usr1 帳號刪除,然後重建帳號,然後重新設定各個物件應該有的屬性。
## 方法二、執行[sp_change_users_login](https://docs.microsoft.com/zh-tw/sql/relational-databases/system-stored-procedures/sp-change-users-login-transact-sql?view=sql-server-ver15)
:::info
:bulb: **注意**
未來的 Microsoft SQL Server 版本將移除這項功能。。
:::
```sql=
USE XXDB;
GO
sp_change_users_login @Action [ ,@UserNamePattern ,@LoginName ,@Password ]
GO
```
* `@Action` 描述此程序所要執行的動作
* `Auto_Fix`:將目前資料庫中 sys.database_principals 系統目錄檢視的使用者項目連結到相同名稱的 SQL Server 登入。
* `@UserNamePattern` 目前資料庫中的使用者名稱
* `@LoginName` SQL Server 登入的名稱
* `@Password` 指派給藉由指定 Auto_Fix 所建立之新 SQL Server 登入的密碼
### 1. 顯示目前使用者與登入對應的報表
```sql=
EXEC sp_change_users_login 'Report';
```
### 2. 將資料庫使用者對應至新的 SQL Server 登入
```sql=
--Create the new login.
CREATE LOGIN MaryB WITH PASSWORD = '982734snfdHHkjj3';
GO
--Map database user MB-Sales to login MaryB.
USE AdventureWorks2012;
GO
EXEC sp_change_users_login 'Update_One', 'MB-Sales', 'MaryB';
GO
```
### 3. 自動將使用者對應至登入,視需要建立新的登入
```sql=
USE AdventureWorks2012;
GO
EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-3x$098f6';
GO
```
## 方法三、執行[ALTER USER](https://docs.microsoft.com/zh-tw/sql/t-sql/statements/alter-user-transact-sql?view=sql-server-ver15)
```sql=
ALTER USER userName
WITH <set_item> [ ,...n ]
[;]
<set_item> ::=
NAME = newUserName
| DEFAULT_SCHEMA = { schemaName | NULL }
| LOGIN = loginName
| PASSWORD = 'password' [ OLD_PASSWORD = 'oldpassword' ]
| DEFAULT_LANGUAGE = { NONE | <lcid> | <language name> | <language alias> }
| ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = [ ON | OFF ]
```
* `userName` 指定在這個資料庫內用來識別使用者的名稱。
* `LOGIN = loginName` 將使用者的安全性識別碼 (SID) 變更為符合登入的 SID,以便將使用者重新對應到另一個登入。
* `NAME = newUserName` 指定新的名稱給這個使用者。 newUserName 不可已存在目前資料庫中。
* `DEFAULT_SCHEMA = { schemaName | NULL }` 指定當伺服器解析這個使用者的物件名稱時,將搜尋的第一個結構描述。 當預設結構描述設為 NULL 時,會從 Windows 群組移除預設結構描述。 NULL 選項不可用於 Windows 使用者。
* `PASSWORD = 'password'` 適用於:SQL Server 2012 (11.x) 及更新版本、SQL Database。
### 1. 變更資料庫使用者的名稱
```sql=
ALTER USER Mary5
WITH NAME = Mary51;
```
### 2. 變更使用者的預設結構描述
```sql=
ALTER USER Mary51
WITH DEFAULT_SCHEMA = Purchasing;
```
### 3. 一次變更數個選項
**適用對象**:SQL Server 2012 (11.x) 及更新版本。
```sql=
ALTER USER Philip
WITH NAME = Philipe
, DEFAULT_SCHEMA = Development
, PASSWORD = 'W1r77TT98%ab@#' OLD_PASSWORD = 'New Devel0per'
, DEFAULT_LANGUAGE= French ;
GO
```
### 4. 更正不相符的 SID
```sql=
ALTER USER Mai
WITH LOGIN = Mai;
GO
```