在 ASE Sybase 15.7 中更改存储过程

Altering Stored Procedures in ASE Sybase 15.7

我是 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 个所以新过程应该是

环境 1:

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

环境 2:

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 多个不同的用户环境,有没有办法以最佳方式进行这种部署?

谢谢!

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

假设您要构建某种脚本解决方案,我建议您查看 ddlgen utility 以帮助提取存储过程的当前权限。

使用 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 and/or sp_procxmode 行,一旦您完成(重新)执行dropped/created 替换存储过程。


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

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

还有 'run-and-parse sp_helprotect/sp_procxmode output' 上的一个替代方案...查看这些过程的源代码并滚动您自己的 SQL 代码以一种您更容易处理的格式提取所需的数据手柄。