我有兴趣为另一个模式及其所有对象(表、视图、过程、包等(创建SYNONYM。当前用户收到一个错误,即某个表不存在。之所以会发生这种情况,是因为他们正在运行一个类似于SELECT*FROM mytable的查询。如果查询是SELECT*FROM myschema.mytable,它就会工作。
创建公共同义词是否使架构对所有用户或角色都可用?授予公共同义词是否存在安全问题?我应该使用非公开的同义词吗我们通过角色为架构分配权限
是否有查询或脚本可以启用此功能?
是的,您可能想要一个公共同义词。来自文档:
指定PUBLIC以创建公共同义词。公共同义词是所有用户都可以访问。但是,每个用户都必须有适当的对基础对象的权限,以便使用同义词。
我认为他们提到的主要安全问题是不要创建与现有架构同名的公共同义词。
另请参见对象名称解析。
这不是一个简单的命令,但你可以用这样的东西编写它:
begin
for r in (select owner, table_name from all_tables where owner = 'MYSCHEMA')
loop
execute immediate 'create public synonym ' || r.table_name || ' for ' || r.owner || '.' || r.table_name;
end loop;
end;
/
编辑:如果你想要的不仅仅是表,你可以将查询改为在所有对象上循环,并选择你想要的对象类型:
begin
for r in (select owner, object_name from all_objects
where owner = 'MYSCHEMA'
and object_type in ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE'))
loop
execute immediate 'create public synonym ' || r.object_name
|| ' for ' || r.owner || '.' || r.object_name;
end loop;
end;
/