Azure SQL 创建数据库范围凭据

8

我正在尝试使用SSMS在Azure SQL中创建作用域凭据。

CREATE DATABASE SCOPED CREDENTIAL [cred-name] WITH IDENTITY = [db-user], SECRET = 'password'

我一直遇到错误消息,指出“'cred-name'附近的语法不正确。预期为'='。”我不确定我的语法有什么问题,因为我过去已经成功执行了这个命令,所以我不知道发生了什么变化。我想也许只是智能感知出了问题,所以我将我的SSMS实例从17.3更新到17.7,但我仍然收到相同的错误消息。
有人知道可能发生了什么变化吗?

你确定需要在Identity属性周围加上括号吗?文档似乎表明它应该是一个字符串值。 - Jacob H
作为字符串值,我仍然得到相同的错误。 - adam
2个回答

6

Microsoft SQL Azure (RTM) - 12.0.2000.8 May 4 2018 13:05:56版本上运行您发布的T-SQL代码会导致以下错误:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'db-user'.

将身份名称括号替换为单引号会导致以下错误:

Msg 15581, Level 16, State 6, Line 1
Please create a master key in the database or open the master key in the session before performing this operation.

使用以下T-SQL创建主密钥可以成功创建凭据:
CREATE MASTER KEY ENCRYPTION BY PASSWORD='MyPassw0rdIsComplex.'
GO

CREATE DATABASE SCOPED CREDENTIAL [cred-name] WITH IDENTITY = 'db-user' , SECRET = 'password'
GO

此外,您可以使用以下查询检查作用域凭据:
SELECT * FROM sys.database_scoped_credentials WHERE credential_identity='db-user'

我正在使用SSMS 17.2版本,但我不确定这是否重要,因为错误会来自SQL Server的引擎本身。

我在数据库中已经有一个主密钥,但我不知道它是否已加密。我修改了主密钥并添加了加密,成功执行了操作,但仍然出现相同的语法错误。我还检查了数据库中的作用域凭据,其中包含一些用于日志和审计的 Blob 存储引用。 - adam
你能通过运行SELECT @@VERSION来发布你正在使用的Azure SQL版本吗? - Evandro de Paula
12.0.2000.8与您上述提到的版本相同。 - adam
很奇怪。我再次运行了创建数据库作用域凭据的命令,然后它完成了。我想知道是否有些更改需要一段时间才能传播。无论如何,我能够继续前进了。 - adam
我曾经遇到过同样的错误,操作顺序确实很重要。Intellisense总是报告作用域凭据为无效语法,但如果在创建主密钥或打开主密钥后立即发出命令,则该命令有效。换句话说,似乎您必须知道数据库主密钥的密码才能处理凭据。如果它被服务主密钥加密,您可能需要打开一个新会话才能使用它。 - bielawski
这是我的问题...它显示了语法错误...但我实际上能够执行它。 - Brian Rice

2

为了启用数据库作用域凭据的加密,需要打开主密钥。

因此,如果已经存在主密钥,可以编写以下内容:

OPEN MASTER KEY DECRYPTION BY PASSWORD = '<your password>';
CREATE DATABASE SCOPED CREDENTIAL [<your credential>]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<your SAS secret without the preleading ?>';
CLOSE MASTER KEY; -- only necessary if you need to close the master key context and continue scripting. (it will close with the session/query close)
... 

如果没有主密钥,您可以编写:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<your password>';
CREATE DATABASE SCOPED CREDENTIAL [<your credential>]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<your SAS secret without the preleading ?>';
CLOSE MASTER KEY; -- only necessary if you need to close the master key context. (it will close with the session/query close)
... 

由于某种原因,智能感知无法理解语法 - 但是它将按照应有的方式执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接