Como hacer Drop Public Synonym masivos
Pues eso , quiero hacer un drop synonym para todos ellos q se hace con sql dinamico pero me esta dando fallos.
Este es el codigo:
declare
PRAGMA Restrict_References;
rows_processed NUMBER;
cur_hdl NUMBER;
stmt_str VARCHAR2(1000);
cursor v_t is select synonym_name
from dba_synonyms
where table_owner='RASC';
v_c dba_constraints.table_name%TYPE;
v_cons dba_constraints.constraint_name%type;
begin
open v_t;
fetch v_t into v_c;
while v_t%FOUND loop
stmt_str := 'drop public synonym :v_1';
cur_hdl := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE (cur_hdl,stmt_str,DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(cur_hdl,':v_1',v_c);
rows_processed := dbms_sql.execute(cur_hdl);
DBMS_SQL.CLOSE_CURSOR(cur_hdl);
--dbms_output.put_line(v_c);
fetch v_t into v_c;
end loop;
close v_t;
end;
Gracias
Este es el codigo:
declare
PRAGMA Restrict_References;
rows_processed NUMBER;
cur_hdl NUMBER;
stmt_str VARCHAR2(1000);
cursor v_t is select synonym_name
from dba_synonyms
where table_owner='RASC';
v_c dba_constraints.table_name%TYPE;
v_cons dba_constraints.constraint_name%type;
begin
open v_t;
fetch v_t into v_c;
while v_t%FOUND loop
stmt_str := 'drop public synonym :v_1';
cur_hdl := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE (cur_hdl,stmt_str,DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(cur_hdl,':v_1',v_c);
rows_processed := dbms_sql.execute(cur_hdl);
DBMS_SQL.CLOSE_CURSOR(cur_hdl);
--dbms_output.put_line(v_c);
fetch v_t into v_c;
end loop;
close v_t;
end;
Gracias
¿Que error te da exactamente?
Estas ejecutando este programa con un usuario con los permisos suficientes para eliminar los sinonimos.
Y solo una pequeña aclaración, con el query en donde buscas los nombres de los sinonimos. Este no te esta devolviendo solo los sinonimos publicos, si no que te esta devolviendo todos los sinonimos Publicos y privados que hacen referencia, a los objetos del esquema 'RASC'.
Puede ser que se tope con un sinonimo que no sea publico, y cuando pasa esto, el codigo que estas ejecutando para hacer la eliminación da errores.
Estas ejecutando este programa con un usuario con los permisos suficientes para eliminar los sinonimos.
Y solo una pequeña aclaración, con el query en donde buscas los nombres de los sinonimos. Este no te esta devolviendo solo los sinonimos publicos, si no que te esta devolviendo todos los sinonimos Publicos y privados que hacen referencia, a los objetos del esquema 'RASC'.
Puede ser que se tope con un sinonimo que no sea publico, y cuando pasa esto, el codigo que estas ejecutando para hacer la eliminación da errores.
Todos los sinonimos son publicos , por eso deje la query asi y el error q me da es el :
*
ERROR en lÃnea 1:
ORA-00995: falta el identificador de sinónimos o no es válido
ORA-06512: en "SYS.DBMS_SYS_SQL", lÃnea 826
ORA-06512: en "SYS.DBMS_SQL", lÃnea 39
ORA-06512: en lÃnea 23
y seguro q tiene los permisos pq es sys el usuario
*
ERROR en lÃnea 1:
ORA-00995: falta el identificador de sinónimos o no es válido
ORA-06512: en "SYS.DBMS_SYS_SQL", lÃnea 826
ORA-06512: en "SYS.DBMS_SQL", lÃnea 39
ORA-06512: en lÃnea 23
y seguro q tiene los permisos pq es sys el usuario
Prueba con:
Execute immediate 'drop public synonym nombre_sinonimo'
Si al ejecutar esto te da problemas. Quiere decir que te hace falta algun permiso. Prueba darle el permiso para eliminar cualquier sinonimo. No importa que sea el usaurio de SYS, prueba darselo lo peor que te puede pasar es que no funcione.
Execute immediate 'drop public synonym nombre_sinonimo'
Si al ejecutar esto te da problemas. Quiere decir que te hace falta algun permiso. Prueba darle el permiso para eliminar cualquier sinonimo. No importa que sea el usaurio de SYS, prueba darselo lo peor que te puede pasar es que no funcione.
La principal duda q tengo es si este tipo de drop se pueden hacer con sql dinamico, o no. Si el codigo esta mal por otra cosa ya lo arreglare.
Alguien sabe si existe esta limitacion?
Alguien sabe si existe esta limitacion?