タグ付けされた質問 「sql-server」

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。


6
SAアカウントおよびその他の既知のアカウント名がセキュリティにもたらすセキュリティ上の脅威は何ですか?
saなどの既知のアカウント名は、データベースにセキュリティ上の脅威をもたらしますか?SQL ServerでWindows認証を使用する場合、同じパスワードポリシーが適用されますか(5回後にアカウントロックアウトを行うように設定されている場合)?

10
データベースを初期サイズ以下に縮小する
ライブの30GBコピーであるSQL Server 2005開発データベースを持っています。devで不要なデータをいくつか削除しました。これにより、使用されるデータファイルスペースが20GBに下がります。したがって、約33%が未使用です。 スペースを再利用する必要があります。これにより、サーバーに2番目の開発DBを(カットダウンバージョンに基づいて)配置できます。ただし、スペースを取り戻すことはできません。次のようにしました。 ファイルの初期サイズSMS2_Dataは30GBです。 DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY) に続く DBCC SHRINKFILE (N'SMS2_Data' , 19500) 喜びがない。バックアップを作成して、初期サイズの小さい新しいDBを作成してから復元しようとしましたが、初期サイズが上書きされて喜びません。また試しました: ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) これは誤り、言った: MODIFY FILEが失敗しました。指定されたサイズは現在のサイズよりも小さいです。 20800を試してから29000(29GB)まで上がり続けましたが、それでも変更できません。 縮小を行った後、回復モードをからFULLに変更しSIMPLEました。喜びがない。 いくつかのTEXT分野と関係があると思いました。システム全体で約6つあります。テストとして、すべてを削除してからファイルを縮小しましたが、変更はありませんでした。 残っている唯一のオプションは、データを別のDBに再インポートすることです。ライブDBで実行する必要があるため、これは実用的ではなく、リスクが高すぎます。半定期的にライブDBのコピーを取得し、dev / testを上書きします。500テーブルのようなものがあります。新しいDBにデータをエクスポートするリスクのない方法を教えてください。 データを別のファイルに移動しようとすると、データの5%を除くすべてがコピーされました。これが、すべてのテキスト列を削除しようとした理由です。 サーバーは互換モード90ですが、SP2です。これで、すべてのテーブルのインデックスの再作成、データベースのバックアップ、ファイルの圧縮、データベースの圧縮の3回を実行しました。まだ喜びはありません。 EXECUTE sp_spaceused 戻り値: database_name database_size unallocated space SMS2Tests 31453.94 MB …

2
saユーザーをロックアウトしました
そこで、Microsoft SQL Server Management Studio 2019の一部の設定を変更しようとしました。ログインモードを混合(WindowsとSQL認証)からWindowsのみに変更したところ、saアカウントでログインできなくなりました。管理者権限を持つ別のアカウントを持っています。 私は何をすべきか?どんな提案も高く評価されます。

1
「データの移動が原因でNOLOCKでスキャンを続行できませんでした」を再現する方法
NOLOCK一部の大規模なジョブで、「データの移動が原因でスキャンを続行できませんでした」というメッセージが時々表示さWITH (NOLOCK)れます。これは、選択クエリで実行されます。 これは、ページ分割があり、データが本来あるべき場所でなくなったときにデータを選択しようとすることと関係があることを理解しています。それが私の環境で起こっていることだと思います。 これをどのように再現しますか? 短期的な回避策を講じてエラーをキャッチし、これが発生したときに再試行しようとしていますが、再現できない場合はテストできません。これを引き起こす合理的に信頼できる方法はありますか? それが発生した場合、クエリを再度実行すると成功します。そのため、実際のデータやデータベースが永続的に破損する心配はありません。クエリ内の一部のテーブル(およびそのインデックス)は、頻繁に削除、再作成、および再設定されるため、これに関連していると想定しています。 削除NOLOCKは、私が対処する長期的な問題です。NOLOCKそもそもそこに置かれた理由は、クエリが非常に悪いため、日常のトランザクションでデッドロックが発生しNOLOCK、デッドロックを阻止するためのバンドエイドが機能したためです(機能しました)。ですから、永久的な解決策ができるまで、私はバンドエイドの上にバンドエイドを必要としています。 Hello Worldでそれを再現できれば、おそらく1時間もかからずにバンドエイドを仕事に投入する予定です。検索と置換の削除を実行できませんNOLOCK。これは、アプリのデッドロックが再び発生し始めるためです。 コミットされた読み取りスナップショット分離を使用することは良い可能性です。詳細については、データベースチームと協力する必要があります。私たちの問題の一部は、そのようなことを処理するSQL Serverの専門家がいないことです。また、現時点でその変更を行うのに十分な分離レベルを理解していません。

3
SQL BULK挿入/ BCPエクスポート後に使用済みメモリが解放されない
次のように非常に基本的なSQLテーブルを作成しました CREATE TABLE [dbo].[TickData]( [Date] [varchar](12) NULL, [Time] [varchar](12) NOT NULL, [Symbol] [varchar](12) NOT NULL, [Side] [varchar](2) NOT NULL, [Depth] [varchar](2) NOT NULL, [Quote] [varchar](12) NOT NULL, [Size] [varchar](18) NOT NULL ) ON [PRIMARY] 次に、3ギガの一括挿入を実行しました BULK INSERT TickData FROM 'C:\SUMO.csv' GO 次に、SQLサーバーのRAM使用量はSkyrockingになり、最大30GoのRAMを消費しました。 これは異常な動作であると考えるのが好きで、これを回避するためにそのアクションを実行できます。 編集: OK、これはデフォルトの動作のようです。けっこうだ。 しかし、なぜ一括挿入が完了した後もメモリが解放されないのですか? いくつかの特別な考慮事項: SQLサーバーがOSから「伝えられた」ときにメモリを解放することに関するコメントのように、24コア32 Gb Xeonサーバーでの実地経験では、これが不正確であることが証明されています。抽出されたデータを処理する必要があるデータ処理アプリケーションの.Netインスタンスのプールがあり、残りのメモリを共有してジョブを実行しようとするため、窒息状態のままになっています。SQLServerがオンになったときよりも時間がかかります。オフにすると、すべてのアプリケーションでメモリを共有できます。SQL …

3
特定のアラビア文字を同一として扱う
アラビア語には、ا(alef)やأ(hamza付きのalef)などの文字があります。 ユーザーはそれらを交換可能に書き込み、それらを交換可能に検索したいと考えています。SQL Serverはそれらを個別の文字として扱います。SQLでそれらを同じ文字として扱うにはどうすればよいですか? 挿入時にأ(hamzaを含むアレフ)をا(alef)に置き換えると考えましたが、アラビア語にはا(alef)やأ(hamefを含むアレフ)以外にも多くの選択肢があります。 私が試したArabic_CI_ASし、Arabic_CI_AIそれは問題を解決していません。 問題を再生成するスクリプトは次のとおりです。 CREATE TABLE [dbo].[TestTable] ( [ArabicChars] [nvarchar](50) NOT NULL, CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED ( [ArabicChars] ASC ) ) ON [PRIMARY]; INSERT INTO TestTable values (N'احمد'); INSERT INTO TestTable values (N'أحمد'); SELECT * FROM TestTable WHERE ArabicChars like N'ا%'; 結果は次のとおりです。 ArabicChars احمد (1 row(s) affected) …

3
一般に、データベースの行のすべての変更の記録はどのように保存されますか?
私が取り組んでいるプロジェクトでは、さらに監査またはロールバックするために、データベースの一部のテーブルの行に対するすべての変更を追跡する必要があります。その行を誰がどのIPアドレスからいつ変更したかを簡単に見つけ、以前のバージョンを復元できる必要があります。 同様のものが、たとえばStack Exchangeでも使用されています。他の人の質問を変更すると、自分が変更したことがわかり、変更をロールバックできます。 現在のスキーマが平均的なビジネスアプリとほとんど同じプロパティ(以下)を持っている場合、オブジェクトのすべての変更をデータベースに格納するために使用される一般的な手法は何ですか? オブジェクトのサイズは比較的小さいです。nvarchar(1000)たとえば、バイナリデータの巨大なblobはなくても、ディスクに直接保存され、Microsoft SQL ではなく直接アクセスされる場合がありますfilestream。 データベースの負荷はかなり低く、データベース全体はサーバー上の1つの仮想マシンによって処理されます。 以前のバージョンへのアクセスは、最新バージョンへのアクセスほど高速である必要はありませんが、それでも最新の状態¹であり、遅すぎない必要があります²。 <tl-dr> 次のようなケースを考えましたが、そういうシナリオはあまり経験がないので、他の人の意見を聞いてみました。 IDとバージョンで行を区別して、すべてを同じテーブルに格納します。IMO、それは深刻な愚かであり、パフォーマンスレベルで遅かれ早かれ傷つけるでしょう。このアプローチでは、最新のアイテムとバージョントレースに異なるセキュリティレベルを設定することも不可能です。最後に、すべてのクエリを記述するのはより複雑になります。実際、最新のデータにアクセスするには、IDですべてをグループ化し、各グループで最後のバージョンを取得する必要があります。 1つのテーブルに最新バージョンを保存し、変更のたびに、古いバージョンを別のスキーマの別のテーブルにコピーします。欠点は、変更されていなくても、常にすべての値を保存することです。変更された値をに設定することnullは解決策ではありません。値がに、nullまたはに変更されたときにも追跡する必要があるためnullです。 最新バージョンを1つのテーブルに保存し、変更されたプロパティのリストと以前の値を別のテーブルに保存します。これは、二つの傷のようだ:最も重要なのは同じ列に以前の値の異質なタイプをソートする唯一の方法は持っているということですbinary(max)。2つ目は、以前のバージョンをユーザーに表示するときに、このような構造を使用するのがより困難になると私は考えています。 前の2つのポイントと同じことを行いますが、バージョンを別のデータベースに保存します。パフォーマンスに関しては、同じデータベースに以前のバージョンを置くことで最新バージョンへのアクセスが遅くなるのを避けるために興味深いかもしれません。それでも、これは時期尚早の最適化であり、同じデータベースに古いバージョンと最新のバージョンを置くことがボトルネックであるという証拠がある場合にのみ実行する必要があると思います。 </ tl-dr> ¹たとえば、HTTPログの場合と同様に、ログファイルに変更を保存し、サーバーの負荷が最も低い夜間にログからデータベースにデータをフラッシュすることはできません。異なるバージョンに関する情報は、すぐに、またはほぼすぐに入手できる必要があります。数秒の遅延は許容範囲です。 ²情報へのアクセスはそれほど頻繁ではなく、特定のユーザーグループのみがアクセスしますが、バージョンのリストが表示されるまで30秒間待つように強制することはできません。この場合も、数秒の遅延は許容されます。

3
並列実行のためにスカラー関数をTVF関数に変換-引き続きシリアルモードで実行
の私のクエリの1つは、リリース後にシリアル実行モードで実行されていましたが、アプリケーションから生成されたLINQ to SQLクエリで参照されるビューで2つの新しい関数が使用されていることに気付きました。そのため、これらのSCALAR関数をTVF関数に変換しましたが、クエリはシリアルモードで実行されています。 以前、他のいくつかのクエリでスカラーからTVFへの変換を実行し、強制的なシリアル実行の問題を解決しました。 これがスカラー関数です: CREATE FUNCTION [dbo].[FindEventReviewDueDate] ( @EventNumber VARCHAR(20), @EventID VARCHAR(25), @EventIDDate BIT ) RETURNS DateTime AS BEGIN DECLARE @CurrentEventStatus VARCHAR(20) DECLARE @EventDateTime DateTime DECLARE @ReviewDueDate DateTime SELECT @CurrentEventStatus = (SELECT cis.EventStatus FROM CurrentEventStatus cis INNER JOIN Event1 r WITH (NOLOCK) ON (cis.Event1Id = r.Id) WHERE (r.EventNumber = …

5
SSMSを介した特定のログインへのSQL Serverへのアクセスを拒否し、.Net SqlClientデータプロバイダーを介して許可する方法
開発者にUPDATE権限がない状況がありますが、開発者はアプリケーションを操作して接続文字列を表示します-> SQLLogin1UPDATE権限を持ついくつかのSQLアカウント(例)からのパスワードを知っています。私たちの操作は現在完璧ではなく、時々本番データを変更する必要があります(まだGUIがありません)。 DBAに連絡してデータを変更するように求める代わりに、開発者は(不適切に)SQLアカウントSQLLogin1(データを変更する権限を持つ)を使用し、SQL Server Management Studioを介して接続してデータを変更します。 SQLLogin1を使用するアプリケーション接続文字列SQLLogin1はDeveloperによって維持されるため、DBA は新しい接続文字列と新しいパスワードを表示しない限り、パスワードを変更できません。 質問: SQLLogin1SQLログインへのアクセスを拒否する方法はありますが、SSMS経由で接続している場合に限られますか? 同時に(で)SQLLogin1接続している場合は、ログインを許可する必要があります。.Net SqlClient Data Providerprogram_namesys.dm_exec_sessions この方法ではSQLLogin1、を使用しているアプリケーションSQLLogin1は引き続き接続できますが、開発者にを使用してSSMS経由で接続させないようにします。

4
このSQLステートメントで二重内部結合を使用する理由は何ですか?
このレガシーSQLクエリを見ています。取得できないビットは、同じ列で同じテーブルを2回内部結合している理由です。Table1とTable1がエイリアス "Table1Alias"で結合されていることについて話している、 SELECT DISTINCT othercolumns, Table1Alias.columna FROM maintable INNER JOIN secondarytable ON maintable.id1 = secondarytable.a_id1 INNER JOIN table1 ON secondarytable.id2 = table1.id3 INNER JOIN table1 Table1Alias ON secondarytable.id2 = Table1Alias.id3 INNER JOIN thirdtable ON table1.id4 = thirdtable.id5 INNER JOIN fourthtable ON thirdtable.id6 = fourthtable.id7 INNER JOIN fivetable ON thirdtable.id8 = …
10 sql-server 

2
大規模な削除クエリがフリーズしているようです
18億行のデータベースで削除クエリを実行しました。この削除により、12億行が削除されます。 後から考えて、このクエリを一度に100mに分割したはずですが、24時間実行されていて、ログファイルがログファイルに許可されている最大サイズである2Tbの位置にいます。 データベースは単純復旧モードです。 このクエリを保存するものはありますか?または、SQL Serverを再起動して何が起こるかを確認する必要がありますか?データベースは使用できなくなりますか?これをできるだけきれいに殺すために私たちにできることはありますか?


3
SQL ServerおよびNUMAのRAMを構成する
偶発的なDB管理者はこちら。 質問: そのサーバーの唯一の目的がSQL Serverデータベースエンジンのみを提供することである場合でも、SQL Serverの最大RAMを手動で制限しますか? 32GB RAMを搭載したMicrosoft Windows 2012 R2 Server、SQL Server 2012 Stdを使用しています。 管理者は常にSQL Serverにログインして、そのコンソールとすべてを使用します。 次に、このWindowsサーバーでNUMAが有効になっているかどうかをどのように確認しますか?

2
SQL Server 2008 R2パーティショニング-同じファイルグループ、1つのファイル、2つのpartition_numbers-ヘルプ
SQL Serverでのパーティション分割は初めてです。BrentOzarのガイドから学びました。 数回、奇妙なシナリオに遭遇しました。私が走るとき: SELECT * FROM ph.FileGroupDetail ORDER BY partition_number Go 2つの異なるpartition_numbersで2回表示されている同じファイルグループがあり、1つは範囲値で最後に正しく、もう1つはnullのrange_valueで最初にあります。 画像を拡大するにはここをクリック いくつかの質問: これはどのように起こっていますか?どこで間違っていますか? どうすれば問題を解決できますか?つまり、最初に空のパーティションが既にあるので、それを最初に取り除く方法です。 ファイル(空の場合は機能していました)とファイルグループを削除しようとしましたが、ファイルグループは削除できないと述べました。 誰かがこれがどのように起こったのか、そしてパーティション2のエントリを取り除く方法を説明してくれませんか?

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