2012-11-18 70 views
9

我需要用新的替换旧的管理员登录名/用户。我尝试了以下方法:在Azure SQL中创建新的管理员级别登录名?

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 

回答

0

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

例如,

EXEC sp_addrolemember 'dbmanager', 'login1User';

EXEC sp_addrolemember'loginmanager','login1User';

看到:https://azure.microsoft.com/documentation/articles/sql-database-manage-logins/

+4

不起作用。我没有看到任何[dbo]。***表在我的非主数据库中,当试图在非主数据库中创建一个表时,我得到一个错误,如'CREATE TABLE权限在数据库master'中被拒绝。'(尽管我不是尝试在主数据库中创建表...) – DeepSpace101

+0

我相信在Azure SQL数据库中没有服务器角色可授予对所有数据库的访问权限。 'dbmanager'可以让你创建数据库,'loginmanager'可以让你创建登录,但是必须使用服务器级别的主体登录来授予访问单个数据库的权限。 – Rory

13

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

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"; ` 
} 
1

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

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

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

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