• ベストアンサー

テーブル名の変更について

次のようなSQL文で、テーブル名を変更しようと思っているのですが、誰かがアクセス中(selectなど)だった場合は、どうなるでしょうか? alter table XXX rename to YYY; また、このような場合の、テストはどうすればよいでしょうか? よろしくお願いlします。

  • Oracle
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

他で誰かがアクセスしていれば、ALTER TABLEが拒否されるはずです。 テストですが、2つのセッションを立ち上げ・・ 1つ目のセッションで、SELECT * FROM XXX rownum=1 for update 次に、2つ目のセッションで、ALTER TABLE XXX REANME TO YYY をすれば、エラー(ORA-54)になることが確認できます。

w0a15455
質問者

お礼

解決しました。 勉強になりました。 ありがとうございました。

関連するQ&A

  • SQLServer2000でテーブル名変更

    現在業務でMircrosoft SQL Server2000を使用しているのですが、テーブル名を変更するというオーダがありました。しかし、24時間365日業務制約をかけられないシステムなのでなるべく短い時間でテーブルのリネームを行いたいです。MSSQLの画面上で名前の変更はできるのですが、この作業を全てのテーブルに適用すると膨大な時間がかかってしまうため、1つのスクリプトにして実行しようと考えています。 オラクルの場合RENAME TO文でテーブル名の変更が可能であると思うのですが、MSSQLの場合どのようなSQL文を適用すれば良いのでしょうか。

  • SQL Server(MSDE2000) : ALTER TABLE

    SQL Server(MSDE2000) : ALTER TABLE した項目に対し、直後に UPDATE で値をセットできない 既存のテーブルを仕様変更するため、列を追加し、初期値で埋める SQL 文を書こうとしていますが、うまく動かず、エラーとなってしまい、原因が判らず困っています。 サンプル SQL 文: ------ CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT) INSERT INTO TEST_TABLE VALUES( 1, 2 ) ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT UPDATE TEST_TABLE SET TEST_FIELD3 = 3 ------ ※テスト毎に、必ず DROP TABLE TEST_TABLE されている事が前提です。 上記 SQL 文のうち、1行目~3行目までを抜粋して実行すると、ちゃんと CREATE TABLE され、INSERT され、ALTER TABLE される事を確認しました。 ところが、4行目までを一気に実行しようとすると、 ------ SQL実行中に以下のエラーが発生しました。 エラーコード:207 [Microsoft][ODBC SQL Server Driver][SQL Server]列名 'TEST_FIELD3' は無効です。 SQLステータス:S0022 ------ となってしまい、UPDATE で初期値を埋める事ができません。 しかも、UPDATE に失敗するどころか、2行目の INSERT から以降が結果に反映されなくなるという状況に陥ってしまいます。 また、既存のテーブルの仕様変更が目的なので、その状況に近づけるために、まず、 ------ CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT) INSERT INTO TEST_TABLE VALUES( 1, 2 ) ------ を実行し、既存のテーブル(とレコード内容)が存在する状態を作り出された事を、ツール等で確認してから、 ------ ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT UPDATE TEST_TABLE SET TEST_FIELD3 = 3 ------ の2行を実行してみると、やはり UPDATE は失敗し、前述と同じエラーが発生します。 またこの場合、ALTER TABLE の実行結果も反映されていません。(つまり、TEST_FIELD3 が列追加されていない) もちろん、ALTER TABLE だけを実行した場合には、ちゃんと列は追加されます。 その後に、UPDATE を実行すれば、ちゃんと追加列に初期値がセットされます。 どうやら、「一回の SQL 文の実行の中で、ALTER TABLE によって新設した列に対しては、UPDATE などでのアクセスはすぐにはできない」のではないか?という状況のようなのです。一回の SQL 文の実行の中において、何らかのトランザクション動作っぽい挙動を感じます。 つまり、ALTER TABLE で追加された列は、その時点ではまだ完全にシステムに認知されていないため、直後の UPDATE 文で認識できずに失敗するのではないか?と。そして、そこでのエラー発生が、ロールバック的に実行した処理をキャンセルしてしまうため、結果として、ALTER TABLE が実行されなかった事になったり、INSERT が実行されなかった事になったりしているのではないか?と思う次第です。 考えられる回避策としては、SQL 文を別々に作成し、個別に実行すれば良いだけの事なのですが、できれば、SQL 文一つにまとめたいと考えています。 どなたか、こういった現象に対する原因・理由の説明、或いは回避策など、何か情報をお持ちの方はいらっしゃいませんでしょうか? 宜しくお願いします。

  • (MySQL)全てのテーブルの照合順序を変更したい

    MySQL5.1.33-communityをWindows上のXAMPPにて使用しています。 操作端末としてphpMyAdmin3.1.3.1を使用しています。 約90個のテーブルがあり、それらの照合順序が意に反してlatin1_swedish_ciになっており、これらを全てujis_japanese_ciに変更したいと思っています。 この場合、ALTER TABLE 文で行えばいいというのはわかるのですが、 ALTER TABLE `テーブル名` CONVERT TO CHARACTER SET ujisとして1つずつテーブル名を指定しなければできないのでしょうか。 まとめて一撃で行う方法はありませんか? ALTER TABLE * CONVERT TO CHARACTER SET ujis とやってみても通りませんでした。 DROP TABLEの場合、テーブル名をコンマで区切って列挙して複数テーブルを一撃でDROPできたのですが、ALTER TABLEの方ではどうも通りませんでした。 普段はPostgreSQLを使っているのでMySQLについてははじめての経験です。詳しい方、よろしくご教示ください。

    • ベストアンサー
    • MySQL
  • オラクルのテーブルについて

    質問があります。 SQL文で指定したテーブル(test_tbl)のCREATEされた 日時とかわかるようなものはないでしょうか? たとえばテーブル (table_a, table_b, teble_c:全て同じ構成だが格納データが異なる)が あって一番最後に作成されたテーブルに アクセスしたい場合なんですが どのようなSQL文になるでしょうか? またそんな事はSQLではかけないような場合、 どのようにすればテーブルのクリエート日付を取得 することができるでしょうか? 宜しくお願いいたします。

  • SQLでフィールドの順番を変更したい

    お世話になっております。 ORACLEを使用しております。 既存のテーブルに新しいフィールドをSQL文にて ALTER TABLE TEST_MST ADD TEST_CD VARCHAR2(2); と言う風に、SQL*PLUSにて追加いたしました。 これを参照しますと、 追加したフィールドがテーブルの一番最後のフィールドに 追加されているのですが、 フィールドの順番を変更したいと考えております。 SQL文にて何か方法はございませんでしょうか。 ご返答を宜しくお願い致します。

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

  • Oracle テーブルの列削除

    タイトルの通りテーブル(test)の列(retu)を削除したいのですが・・・ Sql*pLUS画面 SQL> alter table test drop(retu); ←この用に入力 alter table test drop(retu) * エラー行: 1: エラーが発生しました。 ORA-00905: キーワードがありません。 となってしまい列を削除できません。 なにか構文の間違いでしょうか?

  • 別テーブルを参照し、その内容を別のテーブルに書き込む

    2つのテーブルに存在しているデータを参照し、 取得したデータの結果を3つ目のテーブルに保存する処理をしているのですが // USERのUNIQUEとGAMEのGAME_NOはプライマリーキー select RATE from USER where UNIQUE = xxx select POINT from GAME where GAME_NO = yyy insert into HISTORY set COIN = RATE * POINT 今は一つの保存に対して3つのSQL文を使わなければいけないのですが、 うまいことこの3つのSQL文を一つか二つにつなげるということは出来ないものでしょうか?

    • ベストアンサー
    • MySQL
  • テーブル名を[]でくくらないとエラーになってしまう

    テーブル名を[]でくくらないとエラーになってしまいます sqlserver 2008 express edition を利用しているのですが テーブル名 やカラム名に[]でくくってSQL文を実行しないと エラーが出てしまいます 例えば select * from [table]  の様にしないといけません これを select * from table で実行できるようにしたいのです どうしたらいいのでしょうか 会社ではsqlserver2005を利用しているので 2008からは[]でくくる必要になったのでしょうか それとも初期設定で何かしないといけないのでしょうか 設定方法を教えて下さい sqlserver management studio2008もインストール済みです

  • 続oracleのプライマリ・キー名の変更について

    oracleのテーブル名を変更します。 運用上ネーミングルールとしてプライマリ・キー名はpk_テーブル名としていますので、 プライマリ・キー名もこの時に変更したいのですが、適切な手順を教えてください。 旧テーブル名:table_a 旧プライマリ・キー名:pk_table_a  ↓ ↓ ↓ 新テーブル名:table_b 新プライマリ・キー名:pk_table_b という質問をさせて頂きました。 回答を頂き、一旦納得した気がしたのですが、どうもうまくいきません。 下記を実行すると4のところでコケます。 既にオブジェクトが存在するというものです。 どうやら 2のところのプライマリキー名変更がうまくいっていないか pk_table_aがどこかにゴミとして残っているように思えます。 オブジェクトブラウザというツールで見てみると、 CONSTRAINTにpk_table_bが INDEXのところにpk_table_aが見えています。 手順がおかしいのか? コマンドが間違えているのか? それともプライマリキー名の変更はしない方が良いのか? ここら辺を教えてください。 --1.TABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) / --2.プライマリキー名変更 ALTER TABLE table_a RENAME CONSTRAINT pk_table_a TO pk_table_b / --3.テーブル名変更 RENAME table_a TO table_b / --4.「1」と同じTABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) /