14

我需要用新的管理员登录名/用户替换我的旧管理员登录名/用户。我尝试了以下方法:

CREATE LOGIN newDbAdmin WITH password='123isTheBestPasswordEver'
CREATE USER newDbAdmin

有了这个,我还可以通过 Microsoft SQL Server Management Studio 登录到 Azure SQL。但是,它似乎不是管理员级别的登录+用户。我无法创建表和管理员可以做的其他一些事情。我怀疑我需要对某些模式(dbo?)或类似的东西授予权限......

那么,在 Azure SQL 上创建与原始管理员具有相同权限级别的用户+登录名的正确方法是什么(当我通过 Azure 门户网站创建数据库时创建)。

在相关说明中,我认为处理旧登录的正确方法是:

DROP USER oldAdmin
DROP LOGIN oldAdmin

?

4

3 回答 3

27

您只能拥有一名服务器级管理员。您可以根据需要创建任意数量的其他登录名和用户,但需要分别授予他们访问各个数据库的权限。您可以通过 azure 门户重置服务器级管理员的密码。

Azure SQL 数据库中没有授予对所有数据库的访问权限的服务器角色。dbmanager允许您创建数据库,loginmanager允许您创建登录,但必须使用服务器级别的主体登录来授予对单个数据库的访问权限。

要创建新用户并授予对一个或多个数据库的 dbo 权限:

-- in master
create login [XXXX] with password = 'YYYYY'
create user [XXXX] from login [XXXX];

-- if you want the user to be able to create databases and logins
exec sp_addRoleMember 'dbmanager', 'XXXX';
exec sp_addRoleMember 'loginmanager', 'XXXX'

-- in each individual database, to grant dbo
create user [XXXX] from login [XXXX];
exec sp_addRoleMember 'db_owner', 'XXXX';

是的,您删除用户的方式与在本地 sql 中的方式相同。

如果你想在服务器上的所有数据库上创建一个新用户作为 dbo,你可以使用一个小的 powershell 来让你的生活更轻松:

$newSqlUser = 'YOUR_NEW_LOGIN_HERE';
$serverName = 'YOUR-SERVER-NAME.database.windows.net'
$sqlAdminLogin = 'YOUR-ADMIN-SQL-LOGIN'
$createAdminUser = $TRUE;

# generate a nice long random password
Add-Type -Assembly System.Web
$newSqlPassword = [Web.Security.Membership]::GeneratePassword(25,3) -Replace '[%&+=;:/]', "!"; 

# prompt for your server admin password. 
# Don't need the username param here but can be nice to avoid retyping
$sqlCreds = get-Credential -Username $sqlAdminLogin -Message 'Enter admin sql credentials'

# Create login and user in master db
$sql = "create login [$newSqlUser] with password = '$newSqlPassword'; create user [$newSqlUser] from login [$newSqlUser];"
invoke-sqlcmd -Query $sql -ServerInstance $serverName -Database 'master' -Username $sqlCreds.UserName -Password ( $sqlCreds.GetNetworkCredential().Password )
"new login: $newSqlUser"
"password: $newSqlPassword"

# sql to create user in each db
if ( $createAdminUser ) { `
    $createUserSql = "create user [$newSqlUser] from login [$newSqlUser]; exec sp_addRoleMember 'db_owner', '$newSqlUser'; "; `
} else { `
    $createUserSql = "create user [$newSqlUser] from login [$newSqlUser]; exec sp_addRoleMember 'db_datareader', '$newSqlUser'; exec sp_addRoleMember 'db_denydatawriter', '$newSqlUser';"; `
}

# can't have multiple Invoke-SQLCmd in a pipeline so get the dbnames first, then iterate
$sql = "select name from sys.databases where  name <> 'master';"
$dbNames = @()
invoke-sqlcmd -Query $sql -ServerInstance $serverName -Database 'master' -Username $sqlCreds.UserName -Password ( $sqlCreds.GetNetworkCredential().Password ) | `
   foreach { $dbNames += $_.name } 
# iterate over the dbs and add user to each one
foreach ($db in $dbNames ) { `
       invoke-sqlcmd -Query $createUserSql -ServerInstance $serverName -Database $db -Username ($sqlCreds.UserName) -Password $( $sqlCreds.GetNetworkCredential().Password ); `
      "created user in $db database"; `
}
于 2015-10-29T09:20:33.823 回答
2

您可以使用 Azure AD 来管理服务器。创建一个 DBA 组 - 将所有 DBA 分配给该组。然后将该组分配为服务器的 AD 管理器 - 这允许您拥有多个 DBA

该组中的任何人都将拥有服务器的完整 DBA 权限。

https://docs.microsoft.com/en-gb/azure/sql-database/sql-database-aad-authentication

理想情况下,我认为他们希望您使用 DBA 授予的包含 DB 级别的用户。对我们来说,我们需要多个管理员,因为我们有很多数据库。

于 2017-09-12T11:56:03.770 回答
0

您刚刚创建了一个登录名和一个相应的用户,您必须添加适当的角色成员资格...

例如,

EXEC sp_addrolemember 'dbmanager', 'login1User';

EXEC sp_addrolemember 'loginmanager', 'login1User';

请参阅:https ://azure.microsoft.com/documentation/articles/sql-database-manage-logins/

于 2012-11-18T12:17:13.797 回答