更改数据库 Informix 上的用户权限

Changing user Privileges on a Database Informix

如何在 Informix 中更改用户对数据库、所有表的权限,从查询到 select、删除、更新、插入。

我试过用这样的东西

dbaccess DATABASE exec for i in (select table_name from user_tables) loop execute immediate 'grant select,insert,update,delete on '||i.table_name||' to USER'; end loop

但是没有用。

DB-Access 不是我最喜欢的工具,但它可以在 shell 脚本的一些支持下完成这项工作。您最终会调用它两次,一次是生成 table 名称列表,一次是处理权限。

给定文件 so-6952-3871.sql 包含:

unload to '/dev/stdout'
    select tabname
       from "informix".systables
      where tabid >= 100
        and tabtype = 'T';

shell 脚本 so-6952-3871.sh 完成这项工作,撤销现有权限并授予新权限:

#!/bin/sh
#
# @(#)$Id$
#
# Grant select, insert, delete, update permission on all user tables in a database to a named user.

: "${DBACCESS:=dbaccess}"

if [ $# = 0 ]
then
    echo "[=11=]: you must specify the database and at least one user" >&2
    echo "Usage: [=11=] database user [...]" >&2
fi
dbase=""
shift
if [ $# = 0 ]
then
    echo "[=11=]: must specify at least one user" >&2
    echo "Usage: [=11=] database user [...]" >&2
    exit 1
fi

$DBACCESS $dbase so-6952-3871.sql |
sed -n '/^\([a-zA-Z0-9_]*\)|$/ s///p' |
while read tabname
do
    #echo "Table: $tabname" >&2
    for user in "$@"
    do
        echo "revoke all on $tabname from $user;"
        echo "grant select, insert, delete, update on $tabname to $user;"
    done
done |
$DBACCESS $dbase -

我选择使用 "informix".systables 系统目录 table,因为我的数据库中没有名为 user_tables 的 table。您可以根据需要细化选择标准(例如,省略时间序列 tables)。

如果您有足够的权限在数据库中授予和撤销权限(例如,作为 DBA 或用户 informix),这应该可以正常工作。

我不使用 DB-Access,而是使用我的 SQLCMD(可从 IIUG 软件获得 存档),其中 我写信是为了在 shell 脚本上下文中保持一致,而 DB-Access 没有。 它可以追溯到 1986 年(在 dbaccess 之前;在那些日子里,你 改为使用 isql — DB-Access 是从 isql 中分割出来的 晚上)。 它与 Microsoft 的 johnny-come-lately 程序无关 相同的名称——除了名称和具有相同的通用目的 (操纵 SQL 数据库)。使用 SQLCMD,sed 行无需忽略 DB-Access 在标准输出上的噪声输出。