データベース管理者

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

1
PostgresでCASE式のインデックスを作成する方法
次のように、CASE式にインデックスを作成しようとしています CREATE TABLE test(i INT, j INT); CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j END); このエラーを取得する: ERROR: syntax error at or near "CASE" LINE 1: CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j ... ^ ********** Error ********** ERROR: syntax error at or near "CASE" …

2
各SQLインスタンスのSPNエントリはどのように見えるべきですか?
適切なKerberos接続を取得するためにSPN(サービスプリンシパル名)を正確にフォーマットする方法と、SQLインスタンスごとに必要な数について、矛盾する情報を見つけています。 この2017年のMS文書には、次のものが含まれています。 SQL Server 2008以降、TCP / IP、名前付きパイプ、および共有メモリでのKerberos認証をサポートするために、SPN形式が変更されました。名前付きインスタンスとデフォルトインスタンスでサポートされるSPN形式は次のとおりです。 名前付きインスタンス: MSSQLSvc/FQDN:[port|instancename] デフォルトのインスタンス: MSSQLSvc/FQDN:port|MSSQLSvc/FQDN 新しいSPN形式では、ポート番号は必要ありません。つまり、マルチポートサーバーまたはポート番号を使用しないプロトコルは、Kerberos認証を使用できます。 この最後の段落は、次のいずれか1つのエントリのみが必要であることを意味します。 名前付きインスタンス: MSSQLSvc/sqlbox1.mydomain.org/instance2 デフォルトのインスタンス: MSSQLSvc/sqlbox1.mydomain.org これは、ポート番号だけでなく、使用する名前に関しても、この古い(2011)MSドキュメントと矛盾しているようです。 SPNを作成するには、SQL ServerのNetBIOS名または完全修飾ドメイン名(FQDN)を使用できます。ただし、NetBIOS名とFQDNの両方のSPNを作成する必要があります。 私の環境にすでに存在するSPNを見ると、さまざまな組み合わせがあり、一部のサーバーには最大4つのエントリがあります。 MSSQLSvc/sqlbox1 MSSQLSvc/sqlbox1:1433 MSSQLSvc/sqlbox1.mydomain.org MSSQLSvc/sqlbox1.mydomain.org:1433 MS自身のKerberos構成マネージャーでさえ、最後の2つのバージョンを(適切に難読化して)生成したいようです: 同様に、既存の名前付きインスタンスの場合、奇妙な組み合わせが見られます。それらの一部はほぼ確実に無効です。 MSSQLSvc/sqlbox1:1522 MSSQLSvc/sqlbox1:instance2 MSSQLSvc/sqlbox1.mydomain.org:1522 MSSQLSvc/sqlbox1.mydomain.org:instance2 MSSQLSvc/sqlbox1.mydomain.org/instance2 MSSQLSvc/sqlbox1.mydomain.org:1522:instance2 では、環境でTCPを使用するだけの場合、デフォルトインスタンスと名前付きインスタンスの両方について、実際のDSNはどのように見えるべきでしょうか。 ポートを含めるかどうか。または、ポートのあるものとないものを含めますか? FQDNのみを使用するか、Netbios名のみのエントリが必要ですか?それとも、名前付きパイプ(私たちはそうではありません)を使用している場合のみでしょうか? (コンテキストでは、SQL 2005から2014を実行し、一部はクラスター化され、その他はスタンドアロンです。接続はTCPのみを介して行われ、名前付きパイプは構成マネージャーで無効になっています。SQLサービスアカウントがそれらを作成できるようにする代わりに、手動で修正/作成します。サーバーの起動。)

2
2回実行されたジョブを見つける方法
指定された時間までに実行されたジョブをチェックするクエリはありますか?2つの時間の間にスケジュールされているジョブを確認できますが、それは望みません。 例私が知りたいジョブズそのRAN間16:00:00と17:00:00 でスケジュールされたジョブ15:00:00が1時間以上実行される可能性がある場合もあります。私はグーグルで検索をしました私が得たすべては2回の間にスケジュールされている仕事です

2
SQL Server 2014の圧縮と最大行サイズ
多くのdecimal(26,8)列を含む広い非正規化テーブルを作成する必要があります(1024列の制限より少なく、ほとんどの列はnullまたはゼロになります)。行あたりの制限は8060バイトなので、ページ圧縮を使用してテーブルを作成しようとしました。以下のコードはテーブルを作成し、1つの行を挿入し、行サイズをクエリします。行のサイズが制限をはるかに下回っていますが、テーブルにdecimal(26,8)列を1つ追加しようとすると、エラーが発生し、操作が失敗します。内部オーバーヘッドのバイト。」それだけ多くの列を持つ単一のテーブルを作成する方法はありますか? drop table t1 GO create table t1(c1 decimal(26, 8) null) with (data_compression = page) GO declare @i int = 2; declare @sql varchar(100); while @i <= 486 begin set @sql = 'alter table t1 add c' + convert(varchar, @i) + ' decimal(26, 8) null'; execute (@sql); set @i += …

2
SSMSと登録済みサーバーの結果
背景: 私たちは、AGのサポートチームの1つに「主要な」AGテストハーネスを作成しようとしています。ある時点でどのサーバーがプライマリになるかがわからないため、登録されたサーバーグループに対してTSQLを実行するように指示されています。登録されたサーバーグループは、AG内のすべてのサーバーで構成されます。目標は、現在のプライマリサーバーでのみTSQLを実行することです。 現在のテストハーネス: IF EXISTS (SELECT * FROM sys.dm_hadr_availability_replica_states AS HARS INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME)) BEGIN <<SOME CODE TO EXECUTE>> END 問題点: マルチサーバークエリに応答する最初のサーバーが結果を返さない場合、他のサーバーが後で結果セットを返しても、SSMSは正しい結果セットが結果セットではないと想定します。したがって、このシナリオでは結果は返されません...これは正しくなく、期待される機能ではありません。 SSMS(これはCSチームにとって最も身近なツールです)を使用して、現在のプライマリサーバーでのみ実行を強制する方法を誰かが考えることができますか?

1
大量のセンサーデータのストレージを再設計する
私は、センサーアレイからの気象データを保存するソリューションを実装/再設計することを任されています。アレイは約40のタワーで構成され、それぞれに約10のセンサーがあり、未確定の時間(年)にわたって10秒間隔で大気条件をサンプリングします。このタスクのいくつかのアプリケーションと要件は次のとおりです。 タワー/センサー構成を管理および取得して、データ分析を理解します。 気象観測のためのセンサーまたは時間間隔によるデータ可視化。 モデルとセンサーのパフォーマンスを比較するために、信頼性のある永続的なデータリソース/データセットを顧客に提供します(必要な形式で配信するには、いくつかの後処理が必要になる場合があります)。 注:現在のソリューション(5つのタワーを備えた概念実証として実装)では、データをフラットファイル(1時間に1ファイル)として保存します。 これが将来的にビッグデータの問題になるかどうかは当初はわからなかったので、リレーショナルデータベースとNoSQLデータベースの両方についていくつかのソリューションを調査しましたが、データ管理の専門家ではないため、もう少しガイダンスが必要だと思います。 私が考えたソリューションの1つは、タワー、センサー、タイムスタンプでインデックスが付けられたリレーショナルデータベースにデータを保存し、日付でテーブルを分割することでした。 もう1つは、将来のスケーリングに基づいて、MongoDBなどのドキュメントタイプのNoSQLデータベースに保存し、現在のソリューションの構造を模倣することでした。 これらの良いアプローチのいずれかはありますか?そうでない場合、より良い/推奨されるソリューションは何ですか?また、現在のソリューションを再設計する必要があるでしょうか?フラットファイルを使用する理論的根拠は、リレーショナルデータベースはオーバーヘッドがかかりすぎると信じているということです。もしそうなら、これを回避する方法はありますか?

2
Windows SIDをSQL Server server_user_sidに変換するにはどうすればよいですか?
server_user_sidをユーザー名にSUSER_SNAME変換するこの素晴らしいSQL Server関数があります。これは、よく知られたWindows SIDを(潜在的にローカライズされた)ユーザー名に変換するのに役立ちます。 例: SELECT SUSER_SNAME(0x01020000000000052000000021020000) -- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer') いくつかのグーグルと試行錯誤(=ユーザーを手動で作成し、sys.server_principals後で確認する)で、以下の同等性を決定しました。 Built-in User/Group Windows SID SQL Server server_user_sid BUILTIN\USERS S-1-5-32-545 0x01020000000000052000000021020000 NT AUTHORITY\SYSTEM S-1-5-18 0x010100000000000512000000 Windows SIDをSQL Server server_user_sidsに変換するアルゴリズムは何ですか?

3
「y」日付の「x」製品の価格を取得するために、データベースのすべての価格変更を追跡するにはどうすればよいですか
特定の日付で製品価格のデータベースを照会できるように、製品価格の変化を追跡する必要があります。この情報は、履歴監査を計算するシステムで使用されるため、購入日に基づいて、正しい製品の正しい価格を返す必要があります。 私はデータベースの構築にpostgresを使用したいと思います。 データベースの設計が必要ですが、あらゆるベストプラクティスの提案も歓迎します。

2
補足のユニコード文字シマリスにOracleがJavaとは異なるバイト長を使用するのはなぜですか?
JavaコードでUTF-8文字列をOracle(11.2.0.4.0)列のサイズにトリミングすると、JavaとOracleは文字列を異なるバイト長として認識するため、エラーが発生します。NLS_CHARACTERSETOracleのパラメーターが「UTF8」であることを確認しました。 ユニコードシマリス絵文字を使用して、以下の問題を説明するテストを書きました(🐿️) public void test() throws UnsupportedEncodingException, SQLException { String squirrel = "\uD83D\uDC3F\uFE0F"; int squirrelByteLength = squirrel.getBytes("UTF-8").length; //this is 7 Connection connection = dataSource.getConnection(); connection.prepareStatement("drop table temp").execute(); connection.prepareStatement("create table temp (foo varchar2(" + String.valueOf(squirrelByteLength) + "))").execute(); PreparedStatement statement = connection.prepareStatement("insert into temp (foo) values (?)"); statement.setString(1, squirrel); statement.executeUpdate(); } これはテストの最後の行で失敗し、次のメッセージが表示されます。 …
8 oracle  java  utf-8  unicode 

4
SSRSと管理されたサービスアカウント-構成できませんか?
管理されたサービスアカウントを使用するようにReporting Servicesを構成しようとしています。環境は次のとおりです。 サーバー:Windows 2008 R2 SP1 Reporting Services:SQL Server 2012(バージョン11.0.6567.0) 現在、SSRSはドメインサービスアカウントとして実行されていますが、MSAとして実行するように変更したいと考えています。SQL Serverインスタンスとエージェントの両方が、MSAを使用するように正常に変更されました。 Reporting Services構成マネージャーを介してサービスアカウントをMSAに変更しようとすると、エラーが表示されます。 Microsoft.ReportingServices.WmiProvider.WMIProviderException:アカウント名が無効です。domain \ aliasの形式でアカウントを指定します。 ---> System.Runtime.InteropServices.COMException(0x8004021D):HRESULTからの例外:0x8004021D ---内部例外スタックトレースの終了--- at Microsoft.ReportingServices.WmiProvider.RSWmiAdmin.ThrowOnError(ManagementBaseObject mo)at Microsoft.ReportingServices .WmiProvider.RSWmiAdmin.SetWindowsServiceIdentity(String accountName、SecureString password、Boolean useBuiltinAccount)at ReportServicesConfigUI.WMIProvider.RSReportServerAdmin.SetWindowsServiceIdentity(String accountName、SecureString password、Boolean useBuiltinAccount) 私の質問は簡単です: 管理されたサービスアカウントを使用するようにSSRSサービスアカウントを変更した人はいますか?もしそうなら、どうですか?!

1
GETUTCDATEがSYSDATETIMEOFFSETよりも早いのはなぜですか?
あるいは、マイクロソフトはどのようにしてタイムトラベルを可能にしたのですか? このコードを考えてみましょう: DECLARE @Offset datetimeoffset = sysdatetimeoffset(); DECLARE @UTC datetime = getUTCdate(); DECLARE @UTCFromOffset datetime = CONVERT(datetime,SWITCHOFFSET(@Offset,0)); SELECT Offset = @Offset, UTC = @UTC, UTCFromOffset = @UTCFromOffset, TimeTravelPossible = CASE WHEN @UTC < @UTCFromOffset THEN 1 ELSE 0 END; @Offsetはの前 @UTCに設定されますが、後の値になることもあります。(私はSQL Server 2008 R2とSQL Server 2016でこれを試しました。疑わしい出来事をキャッチするには、数回実行する必要があります。) これは、単に丸めや精度の欠如の問題であるようには見えません。(実際、丸めは時々問題を「修正」するものだと思います。)サンプル実行の値は次のとおりです。 オフセット 2017-06-07 12:01:58.8801139 …

1
SQLite3はjson_extract式でカバリングインデックスを使用していません
式SQLite3を使用して(3.18)でインデックスを作成しようとしていますjson_extract。私の目的は、結果を生成するためにインデックスのみを必要とするクエリを実行することです。これは、json_extract大きなデータセットや値を操作するときにパフォーマンスを低下させる高価な操作であるためです。私は自分のニーズに合うカバリングインデックスが必要だと結論しました。 ステップ1-通常のテーブル構造を使用して理論をテストする CREATE TABLE Player ( Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FirstName TEXT NOT NULL, MiddleName TEXT, LastName TEXT NOT NULL ); CREATE INDEX Player_FirstName ON Player ( FirstName ASC, LastName ASC ); EXPLAIN QUERY PLAN SELECT FirstName, LastName FROM Player WHERE LENGTH(LastName) > 10 ORDER BY FirstName …

1
SELECTリストのセットリターン関数(SRF)について
SELECTリストでSet Returning Function(SRF)を使用する場合とFROM句でSRFを使用する場合で、動作に違いがあるのはなぜですか? たとえば、2つの行を返す単純なSRFの場合: CREATE OR REPLACE FUNCTION gen_series(out integer, out int) RETURNS SETOF record AS $$ SELECT 1,1 UNION SELECT 2,2; $$ LANGUAGE SQL; SELECT gen_series(); それぞれがレコードを含む2つの単一列の行を返します。 => gen_series ------------ (1,1) (2,2) (2 rows) 一方SELECT * FROM gen_series();、レコードが展開された2つの行を返します。 => column1 | column2 ---------+--------- 1 | 1 2 | 2 …

3
FK関係を維持しながら、ID列を含む新しいテーブルにデータを移行する方法
データベース間でデータを移行したい。テーブルスキーマはまったく同じです。 CREATE TABLE Customers( [Id] INT NOT NULL PRIMARY KEY IDENTITY, (some other columns ......) ); CREATE TABLE Orders( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [CustomerId] INT NOT NULL, (some other columns ......), CONSTRAINT [FK_Customers_Orders] FOREIGN KEY ([CustomerId]) REFERENCES [Customers]([Id]) ) 2つのデータベースには異なるデータがあるため、同じテーブルの新しいIDキーは2つのデータベースで異なります。それは問題ではない; 私の目標は、既存のデータに新しいデータを追加することであり、テーブル全体のすべてのデータを完全に置き換えることではありません。ただし、挿入されたデータのすべての親子関係を維持したいと思います。 SSMSの「スクリプトの生成」機能を使用すると、スクリプトは同じIDを使用して挿入を試み、宛先データベースの既存のデータと競合します。データベーススクリプトのみを使用してデータをコピーするにはどうすればよいですか? 宛先のID列を最後の値から通常どおりに継続させたい。 Customers他のUNIQUE NOT NULL制約はありません。他の列に重複するデータがあっても問題ありません(ここでは例として使用CustomersしOrdersているので、全体を説明する必要はありません)。問題は、1対Nの関係についてです。

1
実行プランで不足しているインデックスが表示されているがクエリが高速
実際の実行プランを見ると、クエリの所要時間が1秒未満であっても、インデックスが不足していることがわかります。 SELECT Account.AccountID, Account.Name FROM account LEFT OUTER JOIN accountfeaturesetting afs ON afs.accountid = account.accountid and afs.featureid = 'Schedules' and afs.settingid = 'EditReasons' WHERE ISNULL(afs.Value, '0') = '0' AND EXISTS (SELECT 1 FROM program WHERE program.AccountID = account.AccountID AND program.Active = 1 AND (program.ScheduleEditReasonFlags <> 0 OR program.ScheduleEditReasonFields <> 0)) …

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