我们目前正在将所有内部部署应用程序迁移到Azure环境中。目前,我们的大多数存储过程都有使用xp_cmdshell
在Windows文件共享之间移动文件的查询。
在Azure环境中,所有这些Windows文件共享将被Azure文件共享替换,SQL Server将被Azure SQL托管实例替换。
那么,有没有一种方法可以修改查询,使其适用于Azure文件共享而不是Windows文件共享?
我们在这方面得到的最接近的帮助是在Azure SQL上从Azure Blob存储创建表。是否可以从存储过程访问Azure Blob?
下面是一个解决方案,但它还没有经过测试,所以请在实际生产中使用它之前进行尽职调查:
- 从SSMS连接到SQL MI服务器
- 在服务器中启用
xp_cmdshell
- 使用
net use
命令将Azure文件共享映射到SQL MI服务器 - 您可以从Azure门户存储帐户获取文件共享的用户名和密码
- 一旦映射了Azure文件共享,您就可以使用文件共享,就好像它是SQL MI服务器中的另一个驱动器一样
需要注意的事项:
- 由于网络问题,驱动器可能会被取消映射。因此,在运行与驱动器相关的查询之前,最好先检查驱动器是否已映射
- 请确保将其映射到相同的驱动器号,或者更好地维护一个表,这样就不会有太多不必要的驱动器映射
您不能在Azure SQL MI中使用xp_cmdshell(SQL Server和Azure SQL托管实例之间的T-SQL差异(。其中一个原因是对支持MI的底层服务器的访问受到限制。由于xp_cmdshell允许您从SQL服务器执行操作系统命令,这将对该PaaS服务的安全性和稳定性构成巨大风险。长期以来,即使对于传统的SQL实例,也不鼓励使用它(新开发的代码不应该使用xp_cmdshell存储过程,通常应该禁用它(,大多数安全基准测试都建议它保持禁用状态。
但是,如果您需要访问大容量插入之类的文件,则可以轻松地将它们存储在Blob存储容器中。https://learn.microsoft.com/en-us/sql/relational-databases/import-export/examples-of-bulk-access-to-data-in-azure-blob-storage?view=sql-服务器-ver16
如果你需要管理这些文件,那么最好从azure数据工厂甚至azure自动化这样的工具中进行管理。但是尝试使用SQL服务器作为文件管理器不是理想的解决方案,在Azure SQL MI中也是不可能的。