【发布时间】:2010-12-17 04:54:27
【问题描述】:
我想删除所有名称开头带有“WIN”的用户(例如,“WIN$DOWS”)。是否可以写类似follownig的东西?
drop user where name like 'WIN%'
【问题讨论】:
我想删除所有名称开头带有“WIN”的用户(例如,“WIN$DOWS”)。是否可以写类似follownig的东西?
drop user where name like 'WIN%'
【问题讨论】:
DROP USER 语句不支持 WHERE 子句,更不用说 LIKE 和通配符了。
您需要从DBA_USERS 获取匹配的用户列表,并遍历该列表:
--Bye Users!
FOR i IN (SELECT t.username
FROM DBA_USERS t
WHERE t.username LIKE 'WIN%') LOOP
EXECUTE IMMEDIATE 'drop user '|| i.username ||'';
END LOOP;
【讨论】:
CASCADE
万一级联删除
BEGIN
FOR i IN (
SELECT t.username
FROM DBA_USERS t
WHERE t.username LIKE 'WIN%')
LOOP
EXECUTE IMMEDIATE 'DROP USER '|| i.username || ' CASCADE';
END LOOP;
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line(sqlerrm);
END;
/
【讨论】:
如果没有 BEGIN .. EXCEPTION .. END 语法,我在上面的解决方案中遇到了错误。
这对我有用:
BEGIN
FOR i IN (
SELECT t.username
FROM DBA_USERS t
WHERE t.username LIKE 'WIN%')
LOOP
EXECUTE IMMEDIATE 'DROP USER '|| i.username;
END LOOP;
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line(sqlerrm);
END;
/
对于级联删除,在i.username 之后添加|| ' CASCADE'。
【讨论】: