【问题标题】:Multiple Azure SQL Firewall Rules in One Expression一个表达式中的多个 Azure SQL 防火墙规则
【发布时间】:2018-09-29 22:16:22
【问题描述】:

如何在一个 SQL 表达式中设置 MULTIPLE database-level firewall rules?我有许多 IP 地址要列入多个数据库的白名单。我正在寻找类似以下的操作:

EXECUTE sp_set_database_firewall_rule
@name = N'Test1',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test2',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test3',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test4',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test5',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',,
@name = N'Test6',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test7',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x'

运行上面的查询不起作用。我必须一次输入1。任何帮助表示赞赏。

【问题讨论】:

  • 在回答这个问题之前,我必须问一下您将基础架构部署到 Azure 所使用的方法。您使用的是 ARM 模板还是 Powershell cmdlet?如果是这样,值得考虑通过将 ips 列表作为参数添加到您的 ARM 模板/powershell 脚本来让您的配置管道处理规则。
  • 不使用 ARM 模板,也不使用 Powershell cmdlet。使用 Azure 门户或 Azure CLI 创建资源组、SQL Server 和数据库。使用 Azure 门户创建防火墙规则。使用 SQL Server 管理。 Studio 创建 SQL 表。
  • 我的理解是数据库级别的防火墙规则只能用T-SQL创建。
  • 感谢您的回复,我只是确保我们谈论的是同一件事。希望我下面的回答对你有所帮助。

标签: azure-sql-database firewall rules


【解决方案1】:

正如您在问题中所述,T-SQL 不支持您尝试执行的语法。您可以做的是使用动态 SQL 使其更容易 - 仅使用一条语句:

DECLARE @SQL NVARCHAR(MAX) = '';

;WITH iplists (IPAddrStart, IPAddrEnd, RuleName) AS 
(
    SELECT '100.0.0.0', '100.0.0.1', 'name0'
    UNION ALL
    SELECT '100.0.0.2', '100.0.0.3', 'name1'
    UNION ALL
    SELECT '100.0.0.4', '100.0.0.5', 'name2'
)
SELECT @SQL+= 'EXECUTE sp_set_database_firewall_rule @name = N''' + iplists.RuleName 
+ ''', @start_ip_address = ''' + iplists.IPAddrStart + ''', @end_ip_address = ''' + 
iplists.IPAddrEnd + '''; ' + CHAR(13)
FROM iplists;

--PRINT @SQL;
EXEC (@SQL);

【讨论】:

  • 感谢您的专业知识。问题:在您显示的示例中,IP 范围是否可能?示例:1.1.1.1 - 1.1.1.10 还是需要单独列出每个 IP 地址?
  • 是的,范围是可能的。您必须记住,SQL Azure 将 ip 范围定义为两端包含,因此在上面的示例中,第一条规则将允许 100.0.0.0 和 100.0.0.1。将 CTE 的 IPAddrEnd 字段更改为您所需的值(例如 100.0.0.10),您将拥有一个范围规则。
  • !很好的答案,非常感谢。你让我的生活轻松了很多。您的解决方案完美无缺。我刚刚为 22 个数据库级防火墙规则运行了一个脚本(基于你的)。然后运行SELECT * FROM sys.database_firewall_rules ORDER BY name; 并全部出现。非常非常感谢!
【解决方案2】:

如果您想要每行的地址范围,我知道上述方法最适用。我希望在复制和粘贴方面更容易一些。

这对我有用,因为我只想要相同的 IP 开始和结束 - 所以这样的东西效果很好:

DECLARE @tempThings TABLE
      (
          ipaddr NVARCHAR(30)
      );
INSERT  @tempThings
VALUES
    ( '100.0.0.0' )
   ,( '100.0.0.65' )
   ,( '100.0.0.76' );
  

SELECT
    *
   ,'EXECUTE sp_set_firewall_rule ' + 'N''Name '
    + CONVERT (NVARCHAR(5), CAST(RAND (CHECKSUM (NEWID ())) * 1000 AS INT)) + ''',' + '''' + [ipaddr] + ''',' + ''''
    + [ipaddr] + '''' + ';' [CommandList]
    FROM    @tempThings;

生产:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多