在雪花程序中动态切换角色

时间:2020-04-20 17:19:24

标签: stored-procedures snowflake-cloud-data-platform snowflake-schema

我在雪花程序中有一个用例,其中有两个角色不同的数据库。我想从一个存储过程将数据插入这两个数据库的表中。我在其中一个数据库中创建了过程,过程正在该数据库中插入数据,但是当我尝试在第二个数据库中插入时,它说:

import Foundation

struct Income: Codable {
    var name: String
    var amount: String

    init(name: String, amount: String) {
        self.name = name
        self.amount = amount
    }



    static let DocumentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

    static let ArchiveURL = DocumentsDirectory.appendingPathComponent("incomes").appendingPathExtension("plist")

    static func loadSampleIncomes() -> [Income] {
        return [
            Income(name: "Main Income", amount: "0"),
            Income(name: "Secondary Income", amount: "0"),
            Income(name: "Interest Income", amount: "0")]

    }

    static func saveToFile(incomes: [Income]) {
           let propertyListEncoder = PropertyListEncoder()
           let codedIncomes = try? propertyListEncoder.encode(incomes)

           try? codedIncomes?.write(to: ArchiveURL, options: .noFileProtection)

    }

    static func loadFromFile() -> [Income]? {
            guard let codedIncomes = try? Data(contentsOf: ArchiveURL) else { return nil }

            let propertyListDecoder = PropertyListDecoder()

            return try? propertyListDecoder.decode(Array<Income>.self, from: codedIncomes)
    }

}

然后我尝试在插入过程中的第二个数据库之前使用查询来更改角色,如下所示:

SQL compilation error: Database 'SecondDB' does not exist or not authorized.

这仍然给我错误:

var SwitchToLoader = "use role SecondDbRole";
try {
snowflake.execute 
(
     {sqlText: SwitchToLoader}
);
}
catch (err)  {
     return "Failed: " + err;  
}

那么,有什么建议如何在我的第二个数据库中插入与单一存储过程有不同作用的数据?

1 个答案:

答案 0 :(得分:2)

出于安全目的,您不能在存储过程内使用其他角色。但是,如果作为所有者,您希望调用者享受相同的特权,则始终可以使用所有者的权利来创建特权,而不必在过程中进行任何明确的角色切换。

您只需要包括“执行为所有者”子句即可。

有关调用方和所有者权利的更多信息,请参见我们的文档

https://docs.snowflake.net/manuals/sql-reference/stored-procedures-usage.html#choosing-between-owner-s-rights-and-caller-s-rights