Sql 如何为';它被删除并重新创建?

Sql 如何为';它被删除并重新创建?,sql,oracle,oracle11g,grant,Sql,Oracle,Oracle11g,Grant,我正在进行一个相当新的项目,我们仍在修改Oracle 11g数据库表的设计。因此,我们经常删除并重新创建表,以确保无论何时进行更改,表创建脚本都能按预期工作 我们的数据库由2个模式组成。一个模式有一些带有INSERT触发器的表,这些触发器有时会导致数据被复制到第二个模式中的表中。这要求我们使用管理员帐户登录数据库,例如sysdba和GRANT访问第一个架构,访问第二个架构上的必要表,例如 GRANT ALL ON schema_two.SomeTable TO schema_one; 我们的问

我正在进行一个相当新的项目,我们仍在修改Oracle 11g数据库表的设计。因此,我们经常删除并重新创建表,以确保无论何时进行更改,表创建脚本都能按预期工作

我们的数据库由2个模式组成。一个模式有一些带有
INSERT
触发器的表,这些触发器有时会导致数据被复制到第二个模式中的表中。这要求我们使用管理员帐户登录数据库,例如
sysdba
GRANT
访问第一个架构,访问第二个架构上的必要表,例如

GRANT ALL ON schema_two.SomeTable TO schema_one;
我们的问题是,每当我们对数据库设计进行更改并希望删除和重新创建数据库表时,当删除表时,我们授予
schema_one
的访问权限就消失了。因此,这会创建另一个恼人的步骤,每次删除和重新创建这些表中的一个时,我们都必须使用管理员帐户登录以重新授予访问权限


这不是什么大问题,但我希望从我们的开发和测试过程中尽可能多地减少步骤。是否有任何方法可以
授予
对表的访问权限,使
授予
-ed权限在删除然后重新创建表后仍然有效?如果这是不可能的,那么有没有更好的方法来解决这个问题呢?

您在做什么,而ALTERTABLE语句无法处理这些问题

下一个最好的选择可能是创建一个引用偶尔消失的表的视图-视图不会消失,如果在这种情况下该表不存在,您只会得到一个错误。即:

CREATE VIEW table_vw AS
  SELECT t.* 
    FROM DISAPPEARING_TABLE t

使用*符号还意味着您不必不断更新视图以暴露表中的列。

您可以将
选择任何表
插入任何表
,等等授予schema_one,但这似乎有些过分,并且不会反映您在生产中所做的事情(希望如此)。为什么不能在创建表的同时,以schema_-two的身份登录,同时颁发授权?我总是在创建脚本中这样做,并且只需要使用管理员帐户来授予第三方或系统权限。我怀疑我遗漏了什么…

您可能有一个DDL触发器或一个每隔几分钟运行一次的批处理作业,自动授予特权。但这是一个安全漏洞,不代表生产。

因此授权被撤销的原因是新表是一个不同的对象

SQL> select object_id from user_objects
  2  where object_name = 'T72'
  3  /

 OBJECT_ID
----------
    659195

SQL> drop table t72
  2  /

Table dropped.

SQL> create table t72 (id number)
  2  /

Table created.

SQL> select object_id from user_objects
  2  where object_name = 'T72'
  3  /

 OBJECT_ID
----------
    659212

SQL>
授权在对象上,而不是对象的名称上

关于您的问题,我不理解的是:您有一个进程,它在
schema\u two
中删除并重新创建表。为什么该进程不将这些表上的特权授予
schema\u one
?为什么你有一个管理员帐户来代替它?我假定您正在以
schema\u two
的身份连接以运行DROP和CREATE语句。为什么不直接将GRANT语句添加到该步骤中


因为在对象上授予特权与创建表一样是安装的一部分。因此,您应该有一个处理一切事务的流程。

我建议您可以为用于创建表的帐户提供运行赠款的功能


分享和享受。

是的-对我们来说,这是表格创建脚本的一部分。我肯定在问题描述中遗漏了什么。谢谢;我实际上不知道
选择任何表
权限;我知道没有什么等价物可以在schema_one上授予所有权限。*所以我没有意识到我可以像这样授予一个模式覆盖权限。不过,这可能不是您在生产中想要的,或者应该假设您可以拥有,除非您也拥有该env。我不知道为什么不能在创建表时使用相同的脚本进行授权;schema_-two应该能够向任何人授予对其自身对象的权限,并且在进行生产安装时也可以为您节省一个步骤。有什么原因你不能这样做吗?@EliCourtwright-使用
选择任何表
插入任何表
,等等特权是开发人员的一个经典把戏。它似乎让我们走出了一个洞,但当我们在一个更加封闭的环境(即一个活动的环境)中使用我们的应用程序时,它可能会带来麻烦。我同意Alex的观点,即最好现在就用安装脚本解决实际问题,而不是在UAT中构建被破坏时。倾听经验的声音;)@APC:大体上我同意,但我们的情况比我透露的要复杂;我们控制一个模式,另一个由另一家公司控制,服务器由第三家公司控制,因此我们的一些安装脚本是真实的,而其他脚本只是模拟另一家公司的模式,因此
GRANT
语句最终将出现在其他公司的安装过程中。。。萧瑟。所以我会记住你的观点,当我们的设计更加稳定时,我们可能会停止使用
GRANT ANY
,只使用我们知道需要的有限的
GRANT
语句进行测试,因为你提出了一个很好的观点。Thank.IIRC:如果将列添加到基础表中,则选择*将不起作用-Oracle会在创建时将*转换为列列表-随后将另一列添加到基础表中不会将其添加到视图中,删除列会使视图无效简单地执行ALTERTABLE语句的问题是,我们希望重新测试表创建脚本以及最初用数据填充新创建表的脚本。理想情况下,我们希望在每次进行更改时都进行测试,以便尽早检测破损情况。这就是为什么我们要删除并重新创建表。