一个表达式中的多个 Azure SQL 防火墙规则
Multiple Azure SQL Firewall Rules in One Expression
如何在一个 SQL 表达式中设置多个 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。感谢任何帮助。
正如您在问题中所述,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 开始和结束 - 所以像这样的东西效果很好:
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;
产生:
如何在一个 SQL 表达式中设置多个 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。感谢任何帮助。
正如您在问题中所述,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 开始和结束 - 所以像这样的东西效果很好:
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;
产生: