达梦数据库SQL脚本之约束的启用和禁用,索引的失效和重建

--禁用指定模式下的约束
create or replace procedure test_varchar_insert
        ( var1 varchar(100))
        as
        c_count  int := 0;
        con_name varchar(100);
        tab_name varchar(100);
        sql1     varchar(500);
        sql2     varchar(500);
        c1 cursor;
        begin
                sql1 = 'SELECT TABLE_NAME, CONSTRAINT_NAME FROM  DBA_CONSTRAINTS WHERE OWNER = '''||var1||''';';
                open c1 for sql1;
                        LOOP
                                fetch c1 into tab_name, con_name;
                        EXIT
                WHEN c1%NOTFOUND;
                        sql2 = 'ALTER TABLE ' || var1 || '.' ||tab_name || ' DISABLE CONSTRAINT "' || con_name || '";' ;
                        execute immediate sql2;
                end loop;
                close c1;
        end

call test_varchar_insert('DMHR')--其中DMHR为模式名
--1.禁用约束,索引失效
declare
		var1     varchar(20) := 'SCHEMA_NAME'; --此处为具体的模式名
        con_name varchar(100);
        tab_name varchar(100);
        idx_name varchar(100);
        sql1     varchar(500);
        sql2     varchar(500);
        sql3     varchar(500);
        sql4     varchar(500);
        c1 cursor;
        c2 cursor;
        begin
               --禁用所有约束
                sql1 = 'SELECT TABLE_NAME, CONSTRAINT_NAME FROM  DBA_CONSTRAINTS WHERE OWNER = '''||var1||''';';
                open c1 for sql1;
                        LOOP
                                fetch c1 into tab_name, con_name;
                        EXIT
                WHEN c1%NOTFOUND;
                        sql2 = 'ALTER TABLE ' || var1 || '.' ||tab_name || ' DISABLE CONSTRAINT "' || con_name || '";' ;
                        execute immediate sql2;
                end loop;
                close c1;
              --失效所有索引
               sql3 = 'SELECT INDEX_NAME FROM DBA_INDEXES WHERE INDEX_TYPE=''NORMAL'' AND OWNER = '''||var1||''';';
               open c2 for sql3;
               		   LOOP
               		   		     fetch c2 into idx_name;
                       EXIT
               WHEN c2%NOTFOUND;
                        sql4 = 'ALTER INDEX ' || var1 || '.' ||idx_name || ' UNUSABLE' ;
                        execute immediate sql4;
               end loop;
               close c2;
               		   			
        end

--2.启用约束,重建索引
declare
		var1     varchar(20) := 'SCHEMA_NAME';
        con_name varchar(100);
        tab_name varchar(100);
        idx_name varchar(100);
        sql1     varchar(500);
        sql2     varchar(500);
        sql3     varchar(500);
        sql4     varchar(500);
        c1 cursor;
        c2 cursor;
        begin
               --启用所有约束
                sql1 = 'SELECT TABLE_NAME, CONSTRAINT_NAME FROM  DBA_CONSTRAINTS WHERE OWNER = '''||var1||''';';
                open c1 for sql1;
                        LOOP
                                fetch c1 into tab_name, con_name;
                        EXIT
                WHEN c1%NOTFOUND;
                        sql2 = 'ALTER TABLE ' || var1 || '.' ||tab_name || ' ENABLE CONSTRAINT "' || con_name || '";' ;
                        execute immediate sql2;
                end loop;
                close c1;
              --重建所有索引
               sql3 = 'SELECT INDEX_NAME FROM DBA_INDEXES WHERE INDEX_TYPE=''NORMAL'' AND OWNER = '''||var1||''';';
               open c2 for sql3;
               		   LOOP
               		   		     fetch c2 into idx_name;
                       EXIT
               WHEN c2%NOTFOUND;
                        sql4 = 'ALTER INDEX ' || var1 || '.' ||idx_name || ' REBUILD' ;
                        execute immediate sql4;
               end loop;
               close c2;
               		   			
        end
--批量生成启用约束禁用约束的SQL语句

--先禁用外键约束
select 'alter table '||OWNER||'.'||TABLE_NAME||' DISABLE CONSTRAINT '||CONSTRAINT_NAME||';',
CONSTRAINT_TYPE,DBA_CONSTRAINTS.STATUS 
from DBA_CONSTRAINTS where owner='DMHR' AND CONSTRAINT_TYPE='R';
--再禁用其他约束
select 'alter table '||OWNER||'.'||TABLE_NAME||' DISABLE CONSTRAINT '||CONSTRAINT_NAME||';',
CONSTRAINT_TYPE,DBA_CONSTRAINTS.STATUS 
from DBA_CONSTRAINTS where owner='DMHR' AND CONSTRAINT_TYPE IN ('C','P','U');
--先启用其他约束
select 'alter table '||OWNER||'.'||TABLE_NAME||' ENABLE CONSTRAINT '||CONSTRAINT_NAME||';',
CONSTRAINT_TYPE,DBA_CONSTRAINTS.STATUS 
from DBA_CONSTRAINTS where owner='DMHR' AND CONSTRAINT_TYPE IN ('C','P','U');
--再启用外键约束
select 'alter table '||OWNER||'.'||TABLE_NAME||' ENABLE CONSTRAINT '||CONSTRAINT_NAME||';',
CONSTRAINT_TYPE,DBA_CONSTRAINTS.STATUS 
from DBA_CONSTRAINTS where owner='DMHR' AND CONSTRAINT_TYPE='R';
--查詢所有索引
SELECT INDEX_NAME,STATUS FROM DBA_INDEXES WHERE INDEX_TYPE='NORMAL' AND OWNER = 'DMHR' AND TABLE_NAME NOT LIKE '%_P_%';

--生成禁用normal索引的语句
SELECT 'ALTER INDEX '|| OWNER||'.'||INDEX_NAME ||' UNUSABLE;' FROM DBA_INDEXES WHERE INDEX_TYPE='NORMAL' AND OWNER = 'DMHR' AND TABLE_NAME NOT LIKE '%_P_%';

--查询所有约束
SELECT TABLE_NAME,CONSTRAINT_NAME,STATUS FROM DBA_CONSTRAINTS WHERE OWNER = 'DMHR' AND TABLE_NAME NOT LIKE '%_P_%';

--TBL_MSV_SEND_SCHEME_DETAIL的外键FK_SENDDETAIL_REF_SEND默认为DISABLED状态

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 Red Hat 4.8.3-9 系统的 shell 窗口中执行达梦数据库DM)的 SQL 脚本,您可以按照以下步骤进行操作: 1. 确认您的系统上已经安装了达梦数据库并且配置正确。可以通过运行 "dm -v" 命令来验证数据库的版本和安装情况。 2. 打开一个 shell 窗口,可以通过在终端中输入 "Ctrl + Alt + T" 来打开终端。 3. 进入到包含 SQL 脚本的目录。假设您的脚本文件名为 "script.sql",可以使用 "cd" 命令切换到包含该文件的目录: ``` cd /path/to/script_directory ``` 4. 运行以下命令来执行 SQL 脚本: ``` dmcli -U <用户名> -P <密码> -S <服务器地址>:<端口> -D <数据库名> -f script.sql ``` - <用户名> 和 <密码> 是连接到达梦数据库所需的凭据,根据您的实际情况进行替换。 - <服务器地址> 和 <端口> 是达梦数据库的主机名和端口号,例如 "localhost" 和 "5236"。 - <数据库名> 是要连接的数据库的名称。 5. 执行命令后,系统将提示您输入密码。请键入与上一步中指定的用户名相对应的密码,然后按下 Enter 键。 6. 脚本开始执行,您将看到执行的输出和结果。 在执行脚本过程中,请确保您输入的用户名、密码、服务器地址、端口和数据库名与实际情况相符。另外,还要确保 SQL 脚本文件的位置和文件名是正确的。如有任何执行问题或错误消息,请根据具体错误提示进行排查和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保定公民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值