データベース管理者

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


1
別のマシンをターゲットとするpg_dump中に「pg_catalog.tablename」を作成する権限が拒否されました
一部のテーブルを9.5ベータ2から9.4.4サーバーにダンプしようとしています。私が使用しているコマンドの形式はかなり標準的です: pg_dump -t table dbname | psql -h hostname -d dbname 私はPostgresユーザーを使用していますが、これはおそらく理想的ではないと思いますが、これらはどちらも私が使用する開発データ処理ボックスであり、以下のエラーに関連しています。最初に、エラーが発生しました エラー:認識されない構成パラメーター "row_security" これは、この機能が9.5で新しく追加されたために予想されます。そうです。Postgresの異なるバージョン間でpg_dumpを実行することはお勧めできませんが、非常にあいまいなバグに遭遇し、大きな静的データの量。 したがって、この恐ろしいハックを使用してrow_securityエラーを削除し、最初のエラーで停止をオンにします。 pg_dump -t tablemame dbname |sed 's/SET row_security = off;//'| psql -v ON_ERROR_STOP=1 -h hostname -d dbname 私は今得ます: エラー:「pg_catalog.tablename」を作成する権限が拒否されました詳細:システムカタログの変更は現在許可されていません Postgresユーザー/ロールを使用することは望ましくないかもしれませんが、私の理解では、このような性質の権限の問題はないはずです。これは1回限りの操作であり、これらはライブサービスに接続されていないデータ処理開発ボックスであるため、理想的な企業データアクセスポリシーよりも好都合です。そうは言っても、これを正しく行う方法を理解し、今後これを回避することは良いことです。

1
UPDATE STATISTICS…ROWCOUNTを使用した後に統計をリセットする方法
クエリのチューニングとテストの目的で、を実行して、行数とページ数をテーブルのインデックス統計に手動で割り当てることができますUPDATE STATISTICS。しかし、統計をテーブルの実際の内容に再計算/リセットするにはどうすればよいでしょうか。 --- Create a table.. CREATE TABLE dbo.StatTest ( i int NOT NULL, CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i) ); GO --- .. and give it a thousand-or-so rows: DECLARE @i int=1; INSERT INTO dbo.StatTest (i) VALUES (@i); WHILE (@i<1000) BEGIN; INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest; …

2
未使用のインデックスのベストプラクティス
このクエリに基づいて、総読み取り数が少ない(1または2のように0または0に非常に近い)と、大量または中程度のユーザー更新(このクエリで挿入または削除が見つからなかった)が行数が多い場合、理論的にはインデックスを削除する必要があります。 SELECT DISTINCT OBJECT_NAME(s.[object_id]) AS ObjectName , p.rows TableRows , i.name AS [INDEX NAME] , (user_seeks + user_scans + user_lookups) AS TotalReads , user_updates UserUpdates FROM sys.dm_db_index_usage_stats s INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id INNER JOIN sys.partitions p ON p.object_id = i.object_id WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') …

6
個別の行としてではなく、1つの行の1つのフィールドに複数の値を格納することの利点
前回の毎週の会議中に、データベース管理のバックグラウンド経験がない人がこの質問を持ち出しました。 「データを複数行ではなくインライン(文字列)に保存することを正当化するシナリオはありますか?」 countryStates国の州を保存する場所と呼ばれるテーブルがあるとします。この例では米国を使用します。怠惰にするためにすべての国をリストすることはしません。 そこには2つの列があります。1つが呼び出さCountryれ、もう1つが呼び出されましたStates。ここで説明し、@ srutzkyの回答で提案されているように、これはISO 3166-1 alpha-3でPK定義されたコードになります。 テーブルは次のようになります。 +---------+-----------------------+-------------------------------------------------------+ | Country | States | StateName | +---------+-----------------------+-------------------------------------------------------+ | USA | AL, CA, FL,OH, NY, WY | Alabama, California, Florida, Ohio, New York, Wyoming | +---------+-----------------------+-------------------------------------------------------+ この同じ質問を友人の開発者に尋ねたところ、データトラフィックサイズの観点からは、これは役立つかもしれませんが、このデータを操作する必要がある場合はそうではないと述べました。この場合、リスト内のこの文字列を変換できるアプリケーションコードにインテリジェンスが必要です(このテーブルにアクセスできるソフトウェアがコンボボックスを作成する必要があるとしましょう)。 このモデルはあまり有用ではないと結論付けましたが、これを有効にする方法があるのではないかと疑いました。 私が聞きたいのは、実際に機能する方法で、このようなことをすでに見たり聞いたりしたりしていないかどうかです。

3
カーディナリティの推定値が低いと、INSERTは最小限のログから除外されますか?
2番目のINSERTステートメントが最初のステートメントより〜5倍遅いのはなぜですか? 生成されたログデータの量から、2番目のログは最小限のログ記録に適していないと思います。ただし、データ読み込みパフォーマンスガイドのドキュメントには、両方の挿入を最小限に記録できることが示されています。では、最小限のロギングが主要なパフォーマンスの違いである場合、2番目のクエリが最小限のロギングに適格ではないのはなぜですか?状況を改善するために何ができますか? クエリ#1:INSERT ... WITH(TABLOCK)を使用して5MM行を挿入する 5MM行をヒープに挿入する次のクエリを考えてみます。このクエリは、によって報告されるトランザクションログデータで実行1 secondおよび生成64MBされsys.dm_tran_database_transactionsます。 CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL) GO INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n) SELECT n -- Any table/view/sub-query that correctly estimates that it will generate 5MM rows FROM dbo.fiveMillionNumbers -- Provides greater consistency on my laptop, where other processes are running OPTION …

2
UUIDとIDを使用する必要がありますか
ロギングから遅延相関まで、さまざまな理由で、システムでUUIDをしばらく使用しています。私が使用したフォーマットは、次のように単純になったときに変化しました。 VARCHAR(255) VARCHAR(36) CHAR(36) BINARY(16) BINARY(16)パフォーマンスを基本的な自動インクリメント整数と比較し始めたのは、最後に到達したときです。テストとその結果を以下に示すが、あなただけの要約をしたい場合は、それがあることを示しているINT AUTOINCREMENTとBINARY(16) RANDOM(データベースが前の試験に事前に入力された)200000までの範囲のデータで同じ性能を有します。 私は当初、UUIDを主キーとして使用することに懐疑的でしたが、実際にはまだそうですが、両方を使用できる柔軟なデータベースを作成する可能性はここにあります。多くの人がどちらか一方の利点を強調しますが、両方のデータ型を使用することで相殺される欠点は何ですか? PRIMARY INT UNIQUE BINARY(16) このタイプの設定の使用例は、システム間の関係に一意の識別子が使用される、テーブル間の関係の従来の主キーです。 私が本質的に発見しようとしているのは、2つのアプローチの効率の違いです。追加のデータが追加された後はほとんど無視できる使用される4倍のディスク容量に加えて、それらは同じように見えます。 スキーマ: -- phpMyAdmin SQL Dump -- version 4.0.10deb1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Sep 22, 2015 at 10:54 AM -- Server version: 5.5.44-0ubuntu0.14.04.1 -- PHP Version: 5.5.29-1+deb.sury.org~trusty+3 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; …

3
NOLOCKヒントは、返されるレコードの順序を変更します
テーブルClientフィールドにクラスター化インデックスがありますLastName。 テーブルからすべてのレコードを単純にダンプすると、(nolock)問題のクエリのようにヒントが使用されていない限り、レコードはアルファベット順に表示されます。そのヒントは、レコードの順序を変更します。それをすべきですか?他のどのセッションにも、そのテーブルへの変更を伴うオープントランザクションsp_who2がないことは確かです(少なくとも私には何も表示されていません)。 順序の違いはどのように説明できますか? コメントから引き出された追加情報: による注文はありません。非クラスター化インデックスは順序を強制する必要がありますか? クラスター化インデックスを指定するインデックスヒントを使用する場合でも、クエリは異なる順序を返します。彼らはすべきですか?nolock返されたレコードの順序が、計画の目に見える変更なしに変更されるのはなぜでしょうか。 私はそれらに対してWinDiffを行いました-[the] (nolock)[query hint] を除いて同じです。

3
SSDTデプロイから特定のテーブルを除外する
スキーマにすべてが含まれている既存のデータベースがありますdbo。スキーマを使用して追加するオブジェクトを含むSSDTプロジェクトがありますfoo プロジェクトに次のようなテーブルがあります。 CREATE table foo.a ( id INT NOT NULL CONSTRAINT [PK_foo_a] PRIMARY KEY CLUSTERED CONSTRAINT [FK_foo_a] FOREIGN KEY REFERENCES [dbo].[a], desc NVARCHAR(50) NOT NULL ) dbo.aに依存します。dbo.aには、他の列への外部キーである多くの列があります。他の誰か(デフォルトのスキーマを維持している人)がdbo.aを変更する可能性があります。 私はdbo.aを次のように単純に保存したいと思います: CREATE table dbo.a ( id INT NOT NULL CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED ) したがって、内部的にビルドされますが、デプロイされません。それは可能ですか?
11 ssdt  deployment 

2
PostgreSQLのビューとトリガーを通じて現在のユーザーを追跡する
現在のユーザーに応じてレコードへのアクセスを制限し、ユーザーが行った変更を追跡するPostgreSQL(9.4)データベースがあります。これはビューとトリガーによって達成され、ほとんどの場合これはうまく機能しますが、INSTEAD OFトリガーを必要とするビューに問題があります。私は問題を減らすように努めましたが、これがまだかなり長いことを前もってお詫びします。 状況 データベースへのすべての接続は、単一のアカウントを介してWebフロントエンドから行われますdbweb。接続されると、SET ROLEWebインターフェースを使用するユーザーに対応するように役割が変更され、そのような役割はすべてグループ役割に属しdbuserます。(詳細については、この回答を参照してください)。ユーザーがであるとしますalice。 テーブルのほとんどは、ここで呼び出しprivateて所属するスキーマに配置されていますdbowner。これらのテーブルには直接アクセスできませんdbuserが、別のロールにはアクセスできますdbview。例えば: SET SESSION AUTHORIZATION dbowner; CREATE TABLE private.incident ( incident_id serial PRIMARY KEY, incident_name character varying NOT NULL, incident_owner character varying NOT NULL ); GRANT ALL ON TABLE private.incident TO dbview; 現在のユーザーaliceが特定の行を使用できるかどうかは、他のビューによって決定されます。簡略化された例(減らすことができますが、より一般的なケースをサポートするには、この方法で行う必要があります)は次のようになります。 -- Simplified case, but in principle could join multiple tables to determine allowed …


3
SSDTのように、SSMSでsqlcmdモードの:rを使用して現在のスクリプトの相対パスを使用するにはどうすればよいですか?
同じフォルダにfoo.sqlとbar.sqlがある場合、SSSDからsqlcmdモードでを実行すると、foo.sqlはbar.sqlを参照できます:r ".\bar.sql"。ただし、SSMSはそれを検出しません。Procmonは、SSMSが探していることを示しています%systemroot%\syswow64。 パスを明示的に宣言せずに、現在のスクリプトが保存されているフォルダーを検索するようにSSMSに指示するにはどうすればよいですか?
11 sql-server  ssms  sqlcmd  ssdt 

4
PRIMARY KEYまたはUNIQUE列としてのNVARCHAR列
SQL Server 2012データベースを開発していますが、主キーとしてのnvarchar列に疑問があります。 私はこのテーブルを持っています: CREATE TABLE [dbo].[CODES] ( [ID_CODE] [bigint] IDENTITY(1,1) NOT NULL, [CODE_LEVEL] [tinyint] NOT NULL, [CODE] [nvarchar](20) NOT NULL, [FLAG] [tinyint] NOT NULL, [IS_TRANSMITTED] [bit] NOT NULL DEFAULT 0, CONSTRAINT [PK_CODES] PRIMARY KEY CLUSTERED ( [CODE_LEVEL] ASC, [CODE] ASC ) ) しかし、今私は[CODE]列を主キーとして使用し、列を削除したいと思い[ID_CODE]ます。 NVARCHARとして列がある場合、問題やペナルティはありますPRIMARY KEYか? [CODE]列の値は一意でなければならないので、UNIQUEその列に制約を設定できると思っていました。 [CODE]主キーとして使用する必要がありますか、それとも列にUNIQUE制約を設定した方が良い[CODE]ですか?

1
ストアドプロシージャの実行を許可し、書き込みを許可しない方法は?
SQL Server 2012インスタンスに「読み取り」ユーザーを設定したいのですが。すべてのテーブルとビューからデータを取得するストアドプロシージャ、関数、またはダイレクトSQLステートメントを実行する権利を許可しますが、更新または挿入(つまり、何も読み取らず、何も書き込まない)は許可しません。 名前で各関数またはストアドプロシージャに特別な権限を付与せずにこれを設定できますが、テーブルを変更する権限を取り除いて、関数またはストアドプロシージャの実行権を彼に付与できますか? 代わりにSQL Server 2008を実行すると何が変わりますか? 説明と追加: ストアドプロシージャがデータを変更した場合、ユーザーはエラーメッセージを受け取ります(変更を拒否するか、ストアドプロシージャへのアクセスを完全に拒否します)。 潜在的なソリューションにアクセス許可の拒否が含まれている場合、拒否する代わりに特定のアクセス許可を付与することはできませんか? データベース内のすべてのテーブル、ビューなど(現在および将来存在する)に1つのステートメントで拒否を適用できますか?

8
MySQLクライアントにmylogin.cnfからパスワードを読み取らせるにはどうすればよいですか?
パスワードをインタラクティブに指定する必要なく、mysqlクライアントをmysqlサーバーに接続しようとしています。実行した手順: 1)最初にmylogin.cnfファイルを作成します $ mysql_config_editor set --user=<user> --password --host=<host> Enter password: 2)ファイルが正常に作成されました: $ ls -la .mylogin.cnf -rw-------. 1 urmt urmt 136 Dec 19 11:01 .mylogin.cnf $ mysql_config_editor print --all [client] user = <user> password = ***** host = <host> 3)MySQLクライアントを使用して接続する $ mysql <dbname> ERROR 1045 (28000): Access denied for user '<user>'@'<host>' …

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