我是sql开发人员的新手,我知道这个问题已被提出并且回答了很多次,但我没有找到我需要的答案。我知道它非常基本,但我无法在任何地方找到它。所以这是我的小代码:
SELECT *
FROM CITY;
非常简单,但" city"是我自己创建的用户(称为parking_places)的表(它在系统下)。现在,如果我尝试午餐,我会收到以下错误:
- 00000 - "表或视图不存在"
醇>*原因:
*操作:行错误:163列:6
我想出来,如果我写:
SELECT *
FROM PARKING_PLACES.CITY ;
我得到了预期的结果。现在重点是,我希望每次使用表时都不要写用户名,在网上浏览我发现特权问题(至少我理解),现在我如何给用户parking_places它需要做我想要的特权?或者它不是特权问题?
我已经尝试了
GRANT RESOURCE to parking_places;
代码似乎有效,但似乎也不是我需要的。
如果可能的话,我会更喜欢使用代码而不是使用GUI的程序作为回答,非常感谢!
答案 0 :(得分:3)
要在不指定架构的情况下访问表,您在Oracle数据库中有4个选项:
a)您以表格所在的架构登录。这是非常常见的事情,因为通常您只有一个用户。它的缺点是您的运行时用户实际上是表的所有者,因此不能限制访问。
b)您授权您的用户或每个人访问该表并在PUBLIC中添加同义词。伪模式。 CREATE PUBLIC SYNONYM yourtable FOR owner.yourtable;
。这会使公共空间变得混乱,并且需要sys权限。
c)您授予您的用户或每个人访问该表的权限,并在运行时用户的架构中添加同义词或视图。这不会使公共空间变得混乱,但需要为每个“运行时”用户添加/维护它。
d)以这种方式使用ALTER SESSION SET CURRENT_SCHEMA=owner;
所有后来的非限定表访问都将使用备用模式。当您有运行时用户访问安装用户拥有的架构时,通常会使用此方法。您可以将alter session添加为登录触发器,这样您就不需要在应用程序中执行此操作。
答案 1 :(得分:1)
ALTER SESSION ... oracle-docs ..是sql server和mysql中use database-name
的equvalnet。
使用ALTER SESSION语句设置或修改影响与数据库连接的任何条件或参数。在您断开与数据库的连接之前,该语句将一直有效。
为此,在脚本中的某处添加一行并执行它。或者只是从sql开发人员那里执行,如果你正在这样做的话。
alter session set current_schema = PARKING_PLACES;
该会话将与该用户建立连接,您无需在后续sql statements
中明确提及用户名:
SELECT * FROM CITY;
P.S:你也可以通过右键单击sql developer中的数据库图标并浏览你想要使用的模式来更改模式。
答案 2 :(得分:0)
授予选择权限
GRANT SELECT ON TABLE yourtable to public;
您也可以为特定用户授予权限。
答案 3 :(得分:0)
如果您想从另一个架构中进行选择,则可以使用另一个选项:您有权使用工作台:
/ sqldev:stmt / SET CURRENT SCHEMA ='BLAH';
例如,见下面的imgur。
这将用于该工作表连接的其余部分,默认为相关模式的所有对象。