【发布时间】:2014-08-13 03:44:03
【问题描述】:
我需要创建一个只能选择 Sybase 数据库中所有表的用户。 方法是: 1.创建可以选择所有表的角色。 2. 授予该用户角色。
我的 Sybase 版本是:Adaptive Server Enterprise/15.0.2
【问题讨论】:
我需要创建一个只能选择 Sybase 数据库中所有表的用户。 方法是: 1.创建可以选择所有表的角色。 2. 授予该用户角色。
我的 Sybase 版本是:Adaptive Server Enterprise/15.0.2
【问题讨论】:
虽然另一个答案在技术上是正确的,但它忽略了一个关键细节:您不能简单地将所有表的权限授予单个用户或组 - 您必须自己指定所有表(以及过程、视图等)名称。 通配符不起作用,会导致通用且不是很有帮助的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_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');
复制生成的语句,将它们包装在事务中并执行它:
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
如果您想撤销访问权限,只需使用之前的撤销部分即可。
【讨论】: