Oracle SQLPlus问题 - 将字符串写入txt文件

时间:2011-07-20 19:36:40

标签: sql oracle file sqlplus

我正在尝试将sql命令写入sql文件,以便输出本身可以用作脚本。基本上使用脚本来创建自身格式化为runnable脚本的输出。也许这是多余的,但我还没有想到更好的方法。如果可能的话,我可以使用额外的一组眼睛(或想法)。感谢

这是脚本:

CONNECT &&master_user/&&master_pwd.@&&tns_alias
SET LINESIZE 132 PAGESIZE 0 ECHO OFF FEEDBACK OFF
SET VERIFY OFF HEAD OFF TERM OFF TRIMSPOOL ON
SPO syns_list.sql
--GRANT CREATE ANY SYNONYM TO &&syn_user;//how is this line formed?
select  'create or replace synonym ' || table_name ||
' for ' || '&&master_user..' ||
table_name || ';'
from user_tables
order by table_name asc;
--REVOKE CREATE ANY SYNONYM FROM &&syn_user;//how is this line formed?
SPO OFF;
SET ECHO ON FEEDBACK ON VERIFY ON HEAD ON TERM ON;
exit

这是输出:

//need the "grant" line here
create or replace synonym AGENTS for webdemo_admin.AGENTS;
create or replace synonym CONSTRUCTION_COMPANY for webdemo_admin.CONSTRUCTION_COMPANY;
create or replace synonym CONTRACT for webdemo_admin.CONTRACT;
create or replace synonym CUSTOMERS for webdemo_admin.CUSTOMERS;
create or replace synonym CUSTOMER_INTEREST for webdemo_admin.CUSTOMER_INTEREST;
create or replace synonym FEATURE for webdemo_admin.FEATURE;
create or replace synonym HOME for webdemo_admin.HOME;
create or replace synonym HOME_NONSTD_FEATURE for webdemo_admin.HOME_NONSTD_FEATURE;
create or replace synonym INTEREST for webdemo_admin.INTEREST;
create or replace synonym NON_STD_FEATURE for webdemo_admin.NON_STD_FEATURE;
create or replace synonym SALES for webdemo_admin.SALES;
create or replace synonym STD_FEATURE for webdemo_admin.STD_FEATURE;
create or replace synonym STD_MODEL for webdemo_admin.STD_MODEL;
create or replace synonym STD_MODEL_FEATURE for webdemo_admin.STD_MODEL_FEATURE;
create or replace synonym SUB_CONTRACTOR for webdemo_admin.SUB_CONTRACTOR;
create or replace synonym WARRANTY_WORK for webdemo_admin.WARRANTY_WORK;
//need the "revoke" line here

我确信有更好的方法可以做到这一点,我仍然会随时随地挑选。作为一个解释(为了理解):我希望我维护一个用户完全控制表(和模式),但我需要一个用户(或最多10个用户)与上面列出的私人同义词,以便多个连接具有与房地产代理可能相同类型的访问权限(从Web应用程序的角度查看时)。也就是说,同义词允许选择,插入,更新和删除事务。在创建同义词之前和之后授予/撤销的原因仅在于自动化该过程并消除向普通用户授予创建任何同义词的安全性问题。此外,我不希望同义词是公开的,因为这也是跟踪(并再次出现安全问题)的头痛。无论如何,私人更好,并提供更多的控制。

同样,我感谢任何人可能提出的任何建议。

2 个答案:

答案 0 :(得分:2)

SQL * Plus PROMPT关键字是您追求的吗?这只显示了该行的其余部分:

SQL> DEFINE syn_user = exampleuser1234
SQL> PROMPT GRANT CREATE ANY SYNONYM TO &&syn_user;;
GRANT CREATE ANY SYNONYM TO exampleuser1234;
SQL>

请注意,我们必须加倍分号,因为SQL * Plus会将第一个解释为替换参数syn_user的结尾。

答案 1 :(得分:1)

如果您要将生成的脚本作为同义词所有者运行(看起来是这种情况),则不应该只需要CREATE ANY SYNONYM权限,只需要CREATE SYNONYM权限。我只是在创建用户时授予该权限。

要在此脚本中执行授权,您需要先以特权用户身份进行连接,例如SYSTEM。在这种情况下,您可以将整个事物作为SYSTEM运行,它已经有CREATE ANY SYNONYM。要做到这一点,您只需要修改您的create语句以包含同义词的所有者,例如create or replace synonym <syn_user>.STD_MODEL_FEATURE for webdemo_admin.STD_MODEL_FEATURE;(其中<syn_user>&syn_user替换变量的值)。

(澄清一下,这是接近它的两种不同方式。选择一种或另一种,而不是两者。)