すべての数値列に制約を設定する必要があります。これが私が試したものです:すべてが正でなければなりません
ALTER TABLE * ADD CONSTRAINT Checknumbers CHECK ( > 0 )
これは機能していませんが、解決策が見つかりません。
私が使用できる他の構文はありますか、それともテーブルごとに手動で行う必要がありますか?
各テーブルの列ごとに個別の制約を作成する必要があります。このための動的 SQL を少し書くことができます。
DECLARE
l_sql_stmt VARCHAR2(1000);
BEGIN
FOR x IN (SELECT *
FROM user_tab_columns
WHERE data_type = 'NUMBER'
AND table_name in (SELECT table_name
FROM user_tables
WHERE dropped = 'NO' )
LOOP
l_sql_stmt := 'ALTER TABLE ' || x.table_name ||
' ADD CONSTRAINT chk_' || x.table_name || '_' || x.column_name ||
' CHECK( ' || x.column_name || ' > 0)';
EXECUTE IMMEDIATE l_sql_stmt;
END LOOP;
END;
現在のスキーマのすべてのテーブルのすべての数値列に対して、チェック制約の作成が試行されます。制約名は 30 文字に制限されているため、テーブル名と列名の長さの合計が 25 を超える場合、無効な識別子を生成しようとします。制約名を生成する別の方法を見つける必要があります (または、システムに名前を生成させることもできます)。また、大文字と小文字を区別する識別子を持っている場合、これはそれらを処理しません。それが問題になる場合は、識別子を二重引用符で囲む必要があります。