问题描述
我正在尝试使用一些 azure 文档快速入门教程来创建一个包含一个 sql Server 和一个数据库的资源组。代码运行得很好,我能够创建所有资源。现在我很好奇如何在同一个脚本中运行代码以在我创建的数据库中创建只读用户?
这是我的代码:
import os
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.sql import sqlManagementClient
REGION = 'westus'
GROUP_NAME = 'resource-group-name'
SERVER_NAME = 'server-name'
DATABASE_NAME = 'sample-db'
def run_example():
subscription_id = os.environ.get(
'AZURE_SUBSCRIPTION_ID','11111-11-1111-11111-111111') # your Azure Subscription Id
credentials = ServicePrincipalCredentials(
client_id='my-client-id',secret='my-secret',tenant='tenant'
)
resource_client = ResourceManagementClient(credentials,subscription_id)
sql_client = sqlManagementClient(credentials,subscription_id)
# You MIGHT need to add sql as a valid provider for these credentials
# If so,this operation has to be done only once for each credentials
resource_client.providers.register('Microsoft.sql')
# Create Resource group
print('Create Resource Group')
resource_group_params = {'location': 'westus'}
print_item(resource_client.resource_groups.create_or_update(
GROUP_NAME,resource_group_params))
# Create a sql server
print('Create a sql server')
server = sql_client.servers.create_or_update(
GROUP_NAME,SERVER_NAME,{
'location': REGION,'version': '12.0',# required for create
'administrator_login': 'server-login',# required for create
'administrator_login_password': 'pass-word' # required for create
}
)
print_item(server)
print('\n\n')
# Get sql server
print('Get sql server')
server = sql_client.servers.get_by_resource_group(
GROUP_NAME,)
print_item(server)
print("\n\n")
# List sql servers by resource group
print('List sql servers in a resource group')
for item in sql_client.servers.list_by_resource_group(GROUP_NAME):
print_item(item)
print("\n\n")
# List sql servers by subscription
print('List sql servers in a subscription')
for item in sql_client.servers.list():
print_item(item)
print("\n\n")
# List sql servers usage
print('List sql servers usage')
for item in sql_client.servers.list_usages(GROUP_NAME,SERVER_NAME):
print_metric(item)
print("\n\n")
# Create a database
print('Create sql database')
async_db_create = sql_client.databases.create_or_update(
GROUP_NAME,DATABASE_NAME,{
'location': REGION
}
)
# Wait for completion and return created object
database = async_db_create.result()
print_item(database)
print("\n\n")
# Get sql database
print('Get sql database')
database = sql_client.databases.get(
GROUP_NAME,DATABASE_NAME
)
print_item(database)
print("\n\n")
# List sql databases by server
print('List sql databases in a server')
for item in sql_client.databases.list_by_server(GROUP_NAME,SERVER_NAME):
print_item(item)
print("\n\n")
# List sql database usage
print('List sql database usage')
for item in sql_client.databases.list_usages(GROUP_NAME,DATABASE_NAME):
print_metric(item)
print("\n\n")
def print_item(group):
"""Print an Azure object instance."""
print("\tName: {}".format(group.name))
print("\tId: {}".format(group.id))
print("\tLocation: {}".format(group.location))
if hasattr(group,'tags'):
print("\tTags: {}".format(group.tags))
if hasattr(group,'properties'):
print_properties(group.properties)
def print_metric(group):
"""Print an sql metric."""
print("\tResource Name: {}".format(group.resource_name))
print("\tName: {}".format(group.display_name))
print("\tValue: {}".format(group.current_value))
print("\tUnit: {}".format(group.unit))
def print_properties(props):
"""Print a ResourceGroup properties instance."""
if props and props.provisioning_state:
print("\tProperties:")
print("\t\tProvisioning State: {}".format(props.provisioning_state))
print("\n\n")
if __name__ == "__main__":
run_example()
我错过了最后一点,我想在我创建的数据库中创建这个只读用户。非常感谢您的时间和帮助
解决方法
在 Azure SQL 数据库中创建用户与创建数据库实例非常不同。需要admin账号或足够权限,用户绑定登录,登录必须在master DB中创建,用户必须在当前用户D中创建,然后将数据库角色修改为该用户。您使用的代码不适合创建用户。
即使使用 unique_list = ' '.join(set(features))
脚本,您仍然需要连接字符串,指定数据库/用户/密码。限制是您不能通过一个连接字符串或 SQL 数据库连接访问主数据库和用户数据库。
我不敢说我们不能用代码做到这一点。