【问题标题】:flyway against azure: user permission creating stored procedureflyway against azure:用户权限创建存储过程
【发布时间】:2018-04-12 10:03:29
【问题描述】:

我们使用 FlyWay 作为迁移工具来管理我们的数据库版本。 最近我们在可重复的脚本中添加了两个存储过程,其中一个使用用户定义的类型 (CREATE TYPE)。另一个叫前者。

我在部署脚本中使用的帐户不是 master 上的db_owner(您从 Azure 门户获得的帐户)。相反,我在有问题的数据库上创建了一个单独的部署帐户,最初只是db_ddladmin,现在升级到db_owner,以便它可以在用户定义的类型上使用GRANT EXEC

但是,当我尝试使用此帐户运行迁移时,第二个过程始终失败:

Migration R__21Proc_ConflictsForUI.sql failed
---------------------------------------------
SQL State  : 08S01
Error Code : 0
Message    : I/O Error: Connection reset
Location   : ./db/Stored Procedures/R__21Proc_ConflictsForUI.sql
Line       : 5
Statement  : CREATE PROC Conflicts_For_UI @CustomerId INT, @TotalRows  INT = 20

当我尝试使用我的门户 db_owner 帐户运行相同的迁移时,它也在 master 上。

为什么 Azure 会在第二个过程中关闭连接,而不是第一个?

【问题讨论】:

  • 所以不是 EXEC proc 失败了,而是 CREATE proc 失败了?
  • 正确。我们在脚本顶部有一个 IF EXISTS ,它首先删除 proc。这样可行。这就是第 5 行报错的原因。

标签: sql-server azure stored-procedures flyway


【解决方案1】:

通过仅执行GRANT EXEC,您授予了执行权限,但要能够CREATE PROC 引用UDT,用户应该对UDT 具有REFERENCES 权限。

或者,您可以在 UDT 上授予 CONTROL,这将带给用户

  • REFERENCES

  • EXECUTE

  • VIEW DEFINITION
  • TAKE OWNERSHIP

在 UDT 上

【讨论】:

  • 根据这篇文章technet.microsoft.com/en-us/library/ms189612(v=sql.105).aspxdb_ddladmin已经拥有REFERENCES权限。这在 Azure 和 SQL Server 实例上会有所不同吗?还是默认不适用于UDT?
  • 还要注意,第一个CREATE存储过程脚本应用成功。这是直接引用 UDT(作为过程的参数)的方法。第二个CREATE 过程只是调用第一个过程并将普通表变量作为参数传递。这是因连接重置错误而失败的那个。
  • 我不明白你写了什么帐户:>>> 我在有问题的数据库上创建了一个单独的部署帐户,最初只是作为 db_ddladmin,现在升级到 db_owner 以便它可以 GRANT EXEC on用户定义的类型
  • 这似乎还是服务器级权限和数据库级权限的区别,我找不到任何原因。
  • 要操作 UDT,您不需要任何服务器级别的权限。 DB_owner 可以操作任何数据库对象。但是您仍然没有回答有问题的用户的有效权限是什么。你写了只授予权限的ddl_admin,然后你写了你将它升级到db_owner,他一点问题都没有,然后你写了一个有权限问题的人,但这个人是谁? ddl_admin?数据库所有者?不是 ddl_admin/db_owner 而是仅被授予了对 UDT 的 EXECUTE 权限的人?
猜你喜欢
  • 2012-10-28
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2012-03-14
相关资源
最近更新 更多