【问题标题】:Sybase - How to create read-only user only can SELECT all tables?Sybase - 如何创建只读用户只能选择所有表?
【发布时间】:2014-08-13 03:44:03
【问题描述】:

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

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

【问题讨论】:

    标签: sybase sap-ase


    【解决方案1】:
    • 创建一个只读的role
    • grant 只有新角色的选择权限
    • user 添加到该角色

    【讨论】:

    • 嗨,Meet,您能帮我显示执行上述过程的命令吗? 1. 创建只读角色 2. 仅授予新角色选择权限 3. 将用户添加到该角色
    • 请点击相应的链接 Jack。提供了链接。我没有 sa 角色,因此无法给出准确/经过测试的命令
    【解决方案2】:

    虽然另一个答案在技术上是正确的,但它忽略了一个关键细节:您不能简单地将所有表的权限授予单个用户或组 - 您必须自己指定所有表(以及过程、视图等)名称。 通配符不起作用,会导致通用且不是很有帮助的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_names。在这个例子中,我们得到了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. 如果您想撤销访问权限,只需使用之前的撤销部分即可。

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 2011-11-22
      • 1970-01-01
      • 2014-08-11
      • 2012-04-30
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多