更改数据库 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 在标准输出上的噪声输出。
如何在 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 在标准输出上的噪声输出。