-1

我是 ASE Sybase 15.7 的新手,但在其他 RDBMS 系统中确实有一些背景。因此,我假设 ASE Sybase 15.7 中的存储过程将有一个等效的 CREATE OR REPLACE。

但我似乎没有看到任何方法可以做到这一点。我问过的大多数人建议删除并使用较新版本的存储过程进行创建,但这给我管理存储过程的权限带来了挑战,这些权限在不同环境中有所不同,具体取决于每个环境中的用户。

所以我的问题如下:

假设我有一个这样的存储过程:

ENV1

CREATE Procedure test (
as
begin
SELECT getdate()
end
grant execute on test to group1
go
grant execute on test to group2
go

ENV2 有:

CREATE Procedure test (
as
begin
SELECT getdate()
end
grant execute on test to group1
go
grant execute on test to group2
go
grant execute on test to group3
go

我想更新这个存储的过程给我2个日期而不是1个所以新的过程应该是

ENV1:

CREATE Procedure test (
as
begin
SELECT getdate(), getdate()
end
grant execute on test to group1
go
grant execute on test to group2
go

ENV2:

CREATE Procedure test (
as
begin
SELECT getdate(), getdate()
end
grant execute on test to group1
go
grant execute on test to group2
go
grant execute on test to group3
go

上面当然是一个非常简单的例子。有没有办法部署更改以仅修改保留权限的存储过程主体?

CREATE 或 REPLACE 和 ALTER PROCEDURE 似乎不起作用,删除和创建存储过程将意味着每个环境都需要额外的逻辑来确定要授予的权限。

考虑到我们有 20 多个不同的用户环境,有没有办法以最佳方式进行这种部署?

谢谢!

4

1 回答 1

0

虽然ASE支持create or replace,但这仅适用于ASE 16.x(即,您需要升级到ASE 16.x)。

假设您正在寻找构建某种脚本解决方案,我建议您查看ddlgen 实用程序,以帮助提取存储过程的当前权限。

一个(非常简单)使用ddlgen为存储过程拉取 DDL 的示例:

$ ddlgen -SmyASE -Umylogin -Pmypassword -TP -Nsybsystemprocs.dbo.sp_help -Osp_help.ddl.out
$ cat sp_help.ddl.out
-- Sybase Adaptive Server Enterprise DDL Generator Utility/1 ...snip...
...snip...
use sybsystemprocs
go
...snip...
create procedure sp_help
...snip...
Grant Execute on dbo.sp_help to public Granted by dbo
go
sp_procxmode 'sp_help', anymode
go

一旦您删除/创建了替换存储过程,您就可以从这里grep输出所需grantrevoke和/或行,以便(重新)执行。sp_procxmode


如果您无权访问ddlgen(我知道它包含在ASE安装软件中,但不记得是否在SDK/client 软件安装中提供),您有几个选择:

  • 让 DBA 为您运行ddlgen命令并为您提供结果(是的,我相信 DBA 会喜欢这个想法)
  • 在您的“客户端”机器上ddlgen安装(例如,安装ASE安装包;或从安装中复制所需的文件ASE- 说起来容易做起来难,在升级软件时将是一个 PITA)
  • 运行sp_helprotect <proc_name>(和sp_procxmode <proc_name>)并解析所需的输出grantrevoke和/或sp_procxmode命令

还有一个关于“运行和解析sp_helprotect/sp_procxmode输出”的替代方案……查看这些过程的源代码并滚动您自己的 SQL 代码,以一种更易于处理的格式提取所需的数据。

于 2020-11-24T19:06:03.187 回答