我需要创建一个只能在Sybase数据库中选择所有表的用户。 方式是: 1.创建可以选择所有表的角色。 2.为该用户授予角色。
我的Sybase版本是:Adaptive Server Enterprise / 15.0.2
答案 0 :(得分:3)
答案 1 :(得分:0)
虽然另一个答案在技术上是正确的,但它省略了一个关键细节:您不能简单地将所有表的权限授予单个用户或组 - 您必须自己指定所有表(以及过程、视图等)的名称。 通配符不起作用并导致生成通用且不太有用的 Error -131: Syntax error
消息。
我已经为 Sybase 改编了 SQL Server 2008 中的 a very good workaround by marc_s(在 SYL Anywhere 上测试过,但如果文档正确,也应该适用于 ASE)。
当然可以改进为全自动并考虑更改的表,但是如果您只想快速授予某些用户对相对静态数据库(无论是销售部门还是应用程序)的只读访问权限,那么这足够好:
创建一个用户(您也可以使用 CREATE ROLE
创建一个组):
CREATE USER readonly IDENTIFIED BY 'secretpassword';
检查您需要包含哪些表(例如,如果您想排除系统表)。为此,请查看所有表/视图/过程的 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;
根据您的数据和需求,您可以修改查询以仅返回您需要的 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');
复制生成的语句,将它们包装在一个事务中并执行它:
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;
现在您可以执行 SELECT 语句了。不过,您必须手动将上下文添加到表中:
SELECT * from table1; -- Error -141: table not found
SELECT * from dba.table1; -- works as expected
DELETE FROM dba.table1; -- Error -121: permission denied
如果您想撤销访问权限,只需使用之前的撤销部分即可。