データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

3
PLPGSQLを使用して現在のsearch_pathにテーブルが存在するかどうかを確認するにはどうすればよいですか?
別のアプリケーションのアドオンであるアプリケーションのセットアップスクリプトを作成しているので、他のアプリケーションのテーブルが存在するかどうかを確認したいと思います。そうでない場合は、ユーザーに有用なエラーを提供します。ただし、テーブルを保持するスキーマがわかりません。 DO LANGUAGE plpgsql $$ BEGIN PERFORM 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = current_setting('search_path') AND c.relname = 'foo' AND c.relkind = 'r'; -- not sure if I actually need this or not... IF NOT FOUND THEN RAISE 'This application depends on tables …

2
SQL Server 2008 R2でデータベースメールを介してフォーマットされたHTMLメールを送信する必要がある
私の要件は、自動メールを(データベースメール経由のフォーマット済みHTMLメール)として作成することです。ジョブがトリガーされると、データがテーブルに挿入され、その情報がメールとして送信されるようにスケジュールされています。しかし今クライアントはこのフォーマットで要求しました。 私が行った現在のフォーマット PO Date:2014-11-26 PO ID:PO1 SAP Ref:0001106102 GRN:1067 DealerID:045 Dealer Name:ABC(Pvt)Ltd. 2 Status:New フォーマットのようなテーブルでクライアントからリクエストされたフォーマット PO Date |PO ID| SAP Ref| GRN|DealerID|Dealer Name|Status これは、データをEmail_Table(_ERROR_MAIL)に挿入するために使用するSQLクエリであり、これは要件に応じて必要とされます IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ImpCancelledGRN') BEGIN DROP PROCEDURE [dbo].[ImpCancelledGRN] END GO CREATE PROCEDURE [dbo].[ImpCancelledGRN] WITH ENCRYPTION AS …

2
サブクエリでのORDER BYのデータベース実装
SQLステートメントをラップするアプリケーション(MapServer- http://mapserver.org/)を使用しているため、ORDER BYステートメントは内部クエリにあります。例えば SELECT * FROM ( SELECT ID, GEOM, Name FROM t ORDER BY Name ) as tbl アプリケーションには、さまざまなデータベースドライバーがあります。主にMS SQL ServerドライバーとSQL Server 2008を使用しています。サブクエリでORDER BYが見つかった場合、エラーがスローされます。 MSドキュメントから(これはSQL Server 2000の場合ですが、まだ適用されているようです): ビュー、インライン関数、派生テーブル、またはサブクエリでORDER BY句を使用する場合、順序付けされた出力は保証されません。代わりに、ORDER BY句は、Top演算子によって生成される結果セットの構成が一貫していることを保証するためにのみ使用されます。ORDER BY句は、最も外側のSELECTステートメントで指定されている場合にのみ、順序付けされた結果セットを保証します。 ただし、Postgres(9)およびOracleで実行した場合、同じタイプのクエリが結果を返します-サブクエリで定義された順序で。Postgresでは、クエリプランは結果がソートされていることを示し、Postgresのリリースノートには、サブクエリの順序が使用されることを意味する項目が含まれています。 サブクエリORDER BYが上位クエリと一致する場合はソートを回避 http://en.wikipedia.org/wiki/Order_byの状態: 一部のデータベースシステムでは、副選択またはビュー定義でORDER BY句を指定できますが、そこに存在しても効果はありません。 ただし、クエリプランの私自身のチェックから: SQL Server 2008はサブクエリでのORDER BYをサポートしていません Postgres 9はサブクエリでのORDER BYをサポートしています Oracle 10gはサブクエリでのORDER BYをサポートします だから私の質問は、PostgresとOracleがサブクエリでの並べ替えを許可していないことを正式に確認または否定できるリンクはありますか?


3
billions-rows-tableでの遅いクエリ//使用されたインデックス
私は若い開発者であり、データベース(PostgreSQL 9.3)の使用にあまり熟練していないので、本当に助けが必要なプロジェクトでいくつかの問題に遭遇しました。 私のプロジェクトは、デバイス(最大1000台以上のデバイス)からデータを収集することです。この場合、すべてのデバイスが毎秒1つのデータブロックを送信し、1時間あたり約300万行になります。 現在、すべてのデバイスの受信データを格納する1つの大きなテーブルがあります。 CREATE TABLE data_block( id bigserial timestamp timestamp mac bigint ) データブロックに含めることができる(またはできない)データにはいくつかの種類があるため、テーブルを参照する他のテーブルがありdata_blockます。 CREATE TABLE dataA( data_block_id bigserial data CONSTRAINT fkey FOREIGN KEY (data_block_id) REFERENCES data_block(id); ); CREATE TABLE dataB(...); CREATE TABLE dataC(...); CREATE INDEX index_dataA_block_id ON dataA (data_block_id DESC); ... 1つのdata_blockに3x dataA、1x dataBがあるが、dataCがない可能性があります。 データは数週間保持されるため、このテーブルには約50億行を格納します。現時点では、テーブルに6億行まであり、クエリには非常に長い時間がかかります。私のselectステートメントは常にクエリを実行し、多くの場合はtime + macもクエリを実行するため、私はtimestampandとmacでインデックスを作成することにしました。 CREATE …

1
PostgreSQL:ビューから列を削除
VIEW進化スクリプトを作成しようとしている場所があるので、それに列を追加できます。その部分は問題なく動作します。列は問題なく追加されました。ただし、その逆は機能しません。最後に追加された列を削除すると、ERROR: cannot drop columns from viewメッセージが表示されて失敗します。問題は、この特定のビューにはfromとtoの両方に多くの参照があるため、私はまったくDROP CASCADE気の毒なことはできないということです。 新しく追加された列を指定されたものから削除できない理由はありVIEWますか?次に、このタスクを実行するにはどうすればよいですか? (注:ここに示すのは状況ですが、他の多くの場合でも、ビューから列を削除するなど、同じような状況がよくわかります。)

1
SQL Serverの「強制暗号化」と「強制プロトコル暗号化」
さまざまな設定がサーバーとクライアントの通信の動作にどのように影響するかを理解しようとしています。サーバーに、SQLサービスで使用するように構成された発行済みの交換証明書を持つ自己署名CAをインストールしました。 最初に、ルートCAがクライアントにインストールされていないときに、この接続が失敗することを確認します。しかし、私が何をしてもそれはとにかくうまくいくようです。 理由をよりよく理解するために、私はすべてのオプションとそれらが生み出すべき効果をリストアップしようとしています。しかし、私がそれを正しく理解したかどうかはわかりません... 誰かがここで不足している部分を修正して記入するのを手伝ってくれますか? SQL Serverで「暗号化を強制する」設定を有効にする場合: 実際には、これはEncrypt=True;TrustServerCertificate=True;私の接続文字列の設定と同じです。クライアントは、暗号化を使用する必要があるかどうか、およびサーバーを信頼する必要があるかどうかについては何も言いません。 このオプションは、個々のサービスインスタンスを暗号化するために使用できます。 CAなしの自己署名交換証明書をサポートします。 SQL Serverで「プロトコル暗号化を強制する」設定を有効にする場合: サーバー上のすべてのサービスへのすべてのクライアント接続は暗号化されます。 クライアントとサーバーの両方で使用できる信頼できるCAによって発行された交換証明書が必要です。 クライアントで「プロトコル暗号化を強制する」設定を使用する場合: この単一のクライアントはSSLの使用を強制し、このマシンで利用可能な信頼できるCAによって発行された交換証明書が必要です。これがないと、この接続は失敗します。 サーバーとクライアントの両方で「プロトコル暗号化を強制する」設定を有効にする場合: これは推奨されません。しかし、なぜ?何が起こり、何が失敗しますか? サーバーで「強制暗号化」と「強制プロトコル暗号化」の両方を有効にする場合: これは何をもたらすのでしょうか?Force Protocol Encryptionが有効になっているときにForce Encryptionが何に設定されているかは重要ですか?

2
「psycopg2」を介したPostgreSQLのトランザクションは、カーソルごとまたは接続ごとですか?
psycopg2データベースAPI を使用してPostgreSQL 9.3で作業しています。 DB APIを最小分離レベル(「自動コミット」モード)に設定していて、SQLを介して直接自分のトランザクションを管理しています。例: cur = self.conn.cursor() cur.execute("BEGIN;") cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, )) ret = cur.fetchall() cur.execute("COMMIT;") 基本的に、トランザクションはcur.execute("BEGIN;")そのカーソルだけに限定されていますか、それとも接続全体に対するものself.conn.cursor()ですか()? 私が行っているより複雑なことのいくつかは、論理的に機能に分解する複数の個別のデータベース操作を含みます。これはすべて、接続をメンバーとして持つクラス内にあるため、各関数内にカーソルを作成する方がはるかに便利です。ただし、トランザクション内でカーソルを作成する方法がわかりません。 基本的に、トランザクションが接続ごとの場合、トランザクション内で多数のカーソルをオンザフライで作成できます。カーソルごとの場合は、カーソルをあちこちに移動する必要があります。どっち? あなたが呼び出すことができるという事実はかかわらドキュメントは、これに触れていないconnection.commit()私が作る、かなりのトランザクション制御を接続ごとで自信を持って。
10 postgresql 

4
mysql innodbデータベースのテーブル名+各テーブルのレコード数を表示する
現在のデータベース内のすべてのテーブルを、テーブルの行数とともにリストする方法。 言い換えれば、mysqlでこのようなものを作成するクエリを考えることができますか? +------------------------++------------------------+ | Tables_in_database | Number of rows | +------------------------++------------------------+ | database 1 | 1000 | | database 2 | 1500 | +------------------------++------------------------+ さまざまなアプローチを歓迎します。
10 mysql  innodb  select  count 

2
Transact-SQLでの対称差分演算?
私はいつもについて知られているUNIONSQLでのオペレータが、ごく最近、他の集合演算子があったことを発見し、INTERSECTそしてEXCEPT。4番目の大きな集合演算子である対称差(たとえば、の逆INTERSECT)を行う演算子を見つけることができませんでした。 私は次のようなものを使用して目的の出力を取得できるようです SELECT Field FROM A UNION SELECT Field FROM B EXCEPT SELECT Field FROM A INTERSECT SELECT Field FROM B (私が優先権を正しく持っていると仮定して)、または反完全結合を実行することによって: SELECT A.Field, B.Field FROM A FULL JOIN B ON B.Id = A.Id WHERE B.Id IS NULL OR A.Id IS NULL しかし、これらはどちらも、特に他の3つの基本的な集合演算と比較して、かなり集中的なクエリのように見えます。SQLに対称差分演算はありますか?ドキュメントでそれを見つけることができませんか?それとも、T-SQLに実装する「標準的な」方法はありますか?
10 sql-server  t-sql 

3
.ibd、.frm、およびmysqllogbinファイルからのMySQLテーブルの復元
何らかの理由で、(MySQLまたはphpmyadminに関係なく).frmと.ibdファイルに保存されている自分のテーブルを開こうとすると、構文エラーが表示されるか、存在しないと表示されます。 これと同様の問題があった他の投稿を読みましたが、innodb_file_per_table有効になっているかどうかを確認する方法がわからず、全体的に本当に混乱しています。また、mysql-bin.000002ファイルのコピーをtxtファイルに変換したので、データベースのデータが完全に失われていないことがわかります。 データベースは昨年作成されました。これらのmysql-bin.00000ファイルは6つありますが、なんらかの理由で.000002最大です。現在、すべてのデータベースの.ibdおよび.frmファイルがありますが、MySQLに、または少なくとも読み取り可能なものに復元する方法について、私は途方に暮れています。 Windows 2003 ServerでWampServer 2.4とMySQL 5.6.12を使用しています。また、InnoDBでプラグインをダウンロードする必要がありますか?

1
MySQL照合utf8_unicodeの違い
しかし、私はMySQL照合の重要性について読んでいます。互換性と精度に関してこれまでに学んだことは、これら4つが私の最善の策であるようです。 utf8_unicode_ci utf8_unicode_520_ci utf8mb4_unicode_ci utf8mb4_unicode_520_ci 私の理解から、uft8mb4は多言語(文字)をサポートする文字(たとえば日本語)に適しています。uf8は3バイトのみをサポートし、uf8mb4は4バイトをサポートします。したがって、明らかな選択はuf8mb4であるように聞こえますが、問題は、長さに制限があるようです(くそー!私のケーキも食べて食べたい)これは少し心配です(私は思う)。 次に、520標準について考慮します。それは私がそれで見つけることができなかったものから、より多くを提供します。しかし、それはもちろん問題です。私はそれについてほとんど見つけることができませんでした。それが改善だと人々が言っ​​ているだけですが、それがいかにそうであるかについて非常に曖昧です。 私はできるだけ少ない制限でできるだけ多くのことを望んでいます...私はここの誰かが何かを知っているかもしれないと考えました。MySQLの公式サイトは、私が望んでいたほど情報量が多くありませんでした。 最も互換性、正確性、保存期間が最も長い4つのうちどれですか。また、502標準間の大きな違いは何ですか?
10 mysql 

3
mysqldump --single-transaction、それでも更新クエリはバックアップを待機しています
mysqldump --single-transactionを使用する場合、ドキュメントによると、読み取りロックでテーブルをフラッシュして一貫した状態を取得し、トランザクションを開始する必要があります。ライターは待機していません。 しかし、私は昨夜、次の状況に遭遇しました: show fullプロセスリストからの抜粋: 何百もの... Command: Query Time: 291 State: Waiting for table flush Info: insert into db_external_notification..... 次にこれ: Command: Query Time: 1204 State: Sending data Info: SELECT /*!40001 SQL_NO_CACHE */ * FROM `db_external_notification` 残りのスレッドはスリープ状態です これらの挿入が何を待っているのか誰かが何か知っていますか?クエリを待機させるFLUSHテーブル、DDL、またはマニュアルに記載されているものはありません。 mysqldumpコマンド全体 mysqldump --quick --add-drop-table --single-transaction --master-data=2 -uxx -pxx dbname 私は--quickはここでは冗長であると思います、おそらく以前の時間からの残り物です、このスクリプトは非常に古いですが、何も害しないはず

1
スレッドセーフな方法で値(カウンター)をクエリしてインクリメントする方法は?(競合状態を回避)
各行にカウンター(整数値のみ)があるテーブルでは、現在の値を取得し、同時にそれを増やす必要があります。 効果的に、私はこれをしたいです: SELECT counter FROM table WHERE id=123 UPDATE table SET counter=counter+1 WHERE id=123 ただし、2つのクエリがスレッドセーフではないため、これを行うことは明らかにスレッドセーフではありません。(同じ行で)同じことを行う複数のプロセスが同じカウンター値を取得する場合があります。すべて一意にする必要があるので、各プロセスで実際の現在値を取得し、1つ増やします。 行ごとに手動ロックを実装する構成を考えることができますが、これを行う簡単な方法はあるのでしょうか。
10 mysql  locking 

2
PostgreSQLはNULL以外のDEFAULTを含む列の追加を最適化しますか?
値をNOT NULL持つ列を追加するDEFAULT場合-PostgreSQLはこの操作を最適化しますか? テーブルにn行がある場合、最適化されていないalter-table-add-columnは、デフォルト値のn回の書き込みを生成します。最適化により、DBは即座に新しい列を作成し、適切なインデックスデータ構造でその列の非デフォルト値が見つからない場合に返されるデフォルト値のコピーを1つだけ保存します。 たとえば、Oracle 11gにはそのような最適化があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.