Sybase - 如何创建只读用户只能SELECT所有表?

时间:2014-06-23 07:05:45

标签: sybase sybase-ase

我需要创建一个只能在Sybase数据库中选择所有表的用户。 方式是: 1.创建可以选择所有表的角色。 2.为该用户授予角色。

我的Sybase版本是:Adaptive Server Enterprise / 15.0.2

2 个答案:

答案 0 :(得分:3)

  • 创建只读role
  • grant仅限新角色的选择权
  • user添加到该角色

答案 1 :(得分:0)

虽然另一个答案在技术上是正确的,但它省略了一个关键细节:您不能简单地将所有表的权限授予单个用户或组 - 您必须自己指定所有表(以及过程、视图等)的名称。 通配符不起作用并导致生成通用且不太有用的 Error -131: Syntax error 消息。

我已经为 Sybase 改编了 SQL Server 2008 中的 a very good workaround by marc_s(在 SYL Anywhere 上测试过,但如果文档正确,也应该适用于 ASE)。

当然可以改进为全自动并考虑更改的表,但是如果您只想快速授予某些用户对相对静态数据库(无论是销售部门还是应用程序)的只读访问权限,那么这足够好:

  1. 创建一个用户(您也可以使用 CREATE ROLE 创建一个组):

     CREATE USER readonly IDENTIFIED BY 'secretpassword';
    
  2. 检查您需要包含哪些表(例如,如果您想排除系统表)。为此,请查看所有表/视图/过程的 systable 和用户详细信息的 sysuserperm

     SELECT
       t.table_id,
       t.table_name,
       t.table_type,
       t.creator, 
       u.user_name
     FROM systable AS t
     JOIN sysuserperm AS u ON t.creator = u.user_id
     ORDER BY t.table_id ASC;
    
  3. 根据您的数据和需求,您可以修改查询以仅返回您需要的 table_name。在这个例子中,我们获得了 DBA(所有者 = 架构)拥有的所有视图和表。现在创建 GRANT 语句:

     SELECT
       t.table_name,
       GrantCmd = 'GRANT SELECT ON dba.' + t.table_name + ' TO readonly;',
       RevokeCmd = 'REVOKE SELECT ON dba.' + t.table_name + ' FROM readonly;'
     FROM systable AS t
     WHERE t.creator = 1
     AND (t.table_type = 'BASE' OR t.table_type = 'VIEW');
    
  4. 复制生成的语句,将它们包装在一个事务中并执行它:

     BEGIN TRANSACTION;
     GRANT SELECT ON dba.table1 TO readonly;
     GRANT SELECT ON dba.table2 TO readonly;
     GRANT SELECT ON dba.table3 TO readonly;
     <...>
     COMMIT TRANSACTION;
    
  5. 现在您可以执行 SELECT 语句了。不过,您必须手动将上下文添加到表中:

    SELECT * from table1;     -- Error -141: table not found
    SELECT * from dba.table1; -- works as expected
    DELETE FROM dba.table1;   -- Error -121: permission denied
    
  6. 如果您想撤销访问权限,只需使用之前的撤销部分即可。