
RedShift GRANT简介
Redshift GRANT命令用于控制Amazon Redshift中用户和用户组对数据库及其对象的安全和访问。我们可以在命令中指定从数据库、表、列、模式、程序、函数或语言中读取或写入数据的选项。这些权限也可以用于创建表或视图,写入数据或从其中读取数据,甚至是删除表。与GRANT命令相反的是revoke命令,它可以从一个用户组和用户中删除分配的权限。
授予命令是如何工作的?
GRANT命令可以用来为当前数据库中的任何对象分配任何类型的操作权限。除此之外,它还可以将位于数据库外部的实体的权限分配给语法中指定有ON SCHEMA关键字的用户和用户组。除此以外,GRANT只能给存储过程分配EXECUTE权限。还有一件重要的事情要记住,GRANT权限不能用于为数据库的其他外部对象和事务块分配权限,这些对象从BEGIN关键字开始,以END关键字结束。
语法
Amazon Redshift中GRANT命令的语法如下:
`GRANT {{DELETE | UPDATE | SELECT | REFERENCES | INSERT | DROP} [, …] | ALL [ PRIVILEGES]} ON {ALL TABLES IN SCHEM name of schema [, …] | [TABLE] name of table [, …]} TO {GROUP name of the group | name of user [ WITH GRANT OPTION] | PUBLIC } [, …]`
或
`GRANT {{TEMPORARY | CREATE | TEMP} [, …] | ALL [PRIVILEGES]} ON DATABASE name of database [, …] TO {GROUP name of group | PUBLIC | name of user [ WITH GRANT OPTION]}`
为了操纵用户或消费者的数据共享权限,我们可以使用SHARE权限和ALTER权限。消费者通过使用SHARE命令被分配或移除权限,而对于用户,我们可以使用ALTER权限。
以下是GRANT的语法,用于相同的情况:
`GRANT { SHARE | ALTER } ON DATASHARE name of the data share TO {GROUP name of the group | PUBLIC [, …] | name of the user [ WITH GRANT OPTION]}`
对于数据共享,你可以使用下面的命令:
`GRANT USAGE ON DATASHARE name of data share TO ACCOUNT number of account [, …] | NAMESPACE GUID of name space [, …]`
除了上述语法外,还有许多版本的GRANT语法,这取决于你想把哪个操作的权限分配给哪个数据库对象的用户。关于GRANT语法的完整官方参考,你可以参考这个链接。
下面给出了上述语法中使用的术语:
- SELECT:该命令为从视图和表中选择的数据分配权限。
- INSERT:该命令为插入数据到表或视图的表分配权限,甚至为COPY语句分配权限。
- UPDATE:在给用户分配更新表或列或视图中的数据的权限之前,必须有SELECT命令的权限。
- DELETE:该命令授予从表中删除任何现有数据的权限。这也需要SELECT权限。
- REFERENCES:如果任何一个外键作为表的约束存在,那么我们需要分配表的权限,它指的是被引用的表。如果不是这样,那么该约束就不能在任何表上创建。
- all [privileges]:这个子句将所有操作的权限分配给用户组或用户,以语句中指定的为准。关键字PRIVILEGE的使用是可选的,用于指定。
- ALTER:当我们使用Lake形成时,我们可以使用alter命令,启用Amazon Web Service Glue Data Catalog进行修改。
- DROP:如果我们在Amazon Redshift中分配了删除任何表的权限,我们就可以删除任何表。并且在使用AWS Glue Data Catalog中的湖泊形式时启用。
- ON [TABLE] 表的名称:这个权限是在数据库对象上提供的,它可以是表或视图,关键字TABLE的说明是可选的。
- WITH GRANT选项:这有助于指定用户可以被分配权限,以分配和授予数据库中其他实体的权限。然而,注意GRANT选项不能用于公共或用户组。
RedShift GRANT的例子
下面给出了RedShift GRANT的例子。
假设我们要授予名字为payal的用户在schema educba_articles的所有表中进行选择操作的权限。
为此,我们将使用以下命令。
代码:
`grant select on all tables in schema educba_articles to payal;`
输出

让我们再考虑一个例子,我们将尝试为属于writer_group的用户组分配在educba_articles模式中的主题表中的drop权限。
代码
`grant drop on table educba_articles.topics to group writer_group;`
输出

我们可以通过使用下面的命令来验证添加的权限。
代码
`SELECT u.usename, t.schemaname||'.'||t.tablename, has_table_privilege(u.usename,t.tablename,'select') AS "SELECT permission Assigned" FROM pg_user u CROSS JOIN pg_tables t WHERE u.usename = payal AND t.tablename = "topics";`
输出:我们可以使用下面的命令来验证添加的权限。

结论
使用GRANT命令可以为数据库中的各种实体提供不同的操作权限,也可以使用数据库中的其他外部对象,如果某些条件被接受的话。