2017年12月14日木曜日

SQL Server 2016 insert文で存在しない項目を指定してもストアドプロシージャが成功する

検証用のクエリ
------------------------------------------------------------
create database test
go
use test
go

create table test(i int, n nvarchar(50));
create table test2(i int, n nvarchar(50));

create or alter procedure testsp as
begin
insert into test (i,aaaaaaaaa) select bbbbbbbbb, n from test2 inner join #wrk on #wrk.id = test2.i;
end
コマンドは正常に完了しました。
・・・えっ?!
testテーブルには、aaaaaaaaaなんで項目がないのにエラーになる。
これはストアドのビルドでエラーとして判断してもらいたいものです。

環境:
・Microsoft SQL Server 2016 (SP1-CU2) (KB4013106) - 13.0.4422.0 (X64)
・Microsoft SQL Server 2016 (SP1-CU6) (KB4037354) - 13.0.4457.0 (X64)

2017年12月7日木曜日

クイックフォーマットとフォーマットはどっちが性能がよいのか?を検証してみた。(SSD)

使用したDISK
SSD:crutial MX300 2TB Firmware M0CR050
RAIDボード:PERC H710 mini

クイックフォーマット時間:一瞬(2,3秒)
フォーマと時間:

CrystalDiskMark6.0.0x64の結果
1)クイックフォーマット
1-1.1GBで測定

1-2.2GBで測定
1-3.4GBで測定
1-4.8GBで測定

2)フォーマット
2-1.1GBで測定

2-2.2GBで測定
2-3.4GBで測定
2-4.8GBで測定




2017年12月5日火曜日

IISとIIS Expressの違いについて>Visual Studio+IIS+SQL Serverで開発する場合の組み合わせを検証して見ました。

Visual Studio+IIS+SQL Serverで開発する場合の組み合わせを検証して見ました。
参考に。
Visual Studio Web Server Database VSが一般ユーザの場合 VSが管理者の場合
2015 IIS SQL Server localDB ×エラー※3※4 ×※3⇒ただの警告だから無視する
※10⇒DBをlocalDBからSQLServerへ変更する
SQL Server ×※4
IIS Express SQL Server localDB
SQL Server
2017 IIS SQL Server localDB ×エラー※3※4 ×※3⇒ただの警告だから無視する
※7⇒DBをlocalDBからSQLServerへ変更する
SQL Server ×※4 ○※6⇒※6はコーディングのバグ、※7
IIS Express SQL Server localDB ○※1 ○※6
※6はコーディングのバグ
SQL Server ○※8

※8:SSMSでセッションを切ってあげると動作する。容赦ないセッションの削除バッチを使うといい。
?:本来は動作するはず

------------------------------------------------------------

※1:これは発生しても自然に治った。はて?
---------------------------
Microsoft Visual Studio
---------------------------
ID 22852 のプロセスは実行されていません。
---------------------------
OK   
---------------------------

Microsoft Visual Studio ID 22852 のプロセスは実行されていません。

※2
---------------------------
Microsoft Visual Studio
---------------------------
プログラム 'http://localhost:83/MvcModel/Admin/Home/Index' を開始できません。



リモート プロシージャ コールに失敗し、実行されませんでした。


---------------------------
OK   
---------------------------

※3
DBが SQL Server Express LocalDBだとIISと組み合わせて使用する警告が発生する

※4
---------------------------
Microsoft Visual Studio
---------------------------
Web サーバーでデバッグを開始できません。起動された URL に一致する Web サイトは IIS の一覧に含まれていません。

詳細については [ヘルプ] をクリックしてください。
---------------------------
OK   ヘルプ   
---------------------------

※5
---------------------------
Microsoft Visual Studio
---------------------------
Web サーバーでデバッグを開始できません。リモート サーバーがエラーを返しました: (403) 使用不可能

詳細については [ヘルプ] をクリックしてください。
---------------------------
OK   ヘルプ   
---------------------------

※6
HomeControllerが複数見つかるえらーが発生

※7
System.Data.SqlClient.SqlException が発生しました
  HResult=0x80131904
  Message=SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 50 - Local Database Runtime エラーが発生しました。LocalDB インスタンスを開始する際にエラーが発生しました: SQL Server プロセスを開始できませんでした。
)
  Source=.Net SqlClient Data Provider
  スタック トレース:
<例外のスタック トレースを評価できません>


※8

System.Data.SqlClient.SqlException が発生しました
  HResult=0x80131904
  Message=データベース "MvcModel" は現在使用中なので削除できません。
  Source=.Net SqlClient Data Provider
  スタック トレース:
<例外のスタック トレースを評価できません>


※9
ALTER TABLE [dbo].[Key2Table] ADD CONSTRAINT [PK_dbo.Key2Table] PRIMARY KEY ([Key1], [Key22])
System.Data.SqlClient.SqlException (0x80131904): オブジェクト名 'dbo.Key2Table' およびインデックス名 'PK_dbo.Key2Table' に重複したキーが見つかったので、CREATE UNIQUE INDEX ステートメントは終了しました。重複したキーの値は (1, 0) です。
制約またはインデックスを作成できませんでした。以前のエラーを調べてください。
ステートメントは終了されました。
   場所 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   場所 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   場所 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   場所 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   場所 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   場所 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   場所 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   場所 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
   場所 System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   場所 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   場所 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
   場所 System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
   場所 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   場所 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   場所 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   場所 System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
   場所 System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   場所 System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   場所 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   場所 System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   場所 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   場所 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   場所 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   場所 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   場所 System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   場所 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:15235e99-b98f-4952-b7c6-3713e4f35bd3
Error Number: 1505、State: 1、Class: 16
オブジェクト名 'dbo.Key2Table' およびインデックス名 'PK_dbo.Key2Table' に重複したキーが見つかったので、CREATE UNIQUE INDEX ステートメントは終了しました。重複したキーの値は (1, 0) です。
制約またはインデックスを作成できませんでした。以前のエラーを調べてください。
ステートメントは終了されました。
PM> 

※10
SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 50 - Local Database Runtime エラーが発生しました。LocalDB インスタンスを開始する際にエラーが発生しました: SQL Server プロセスを開始できませんでした。)

2017年12月4日月曜日

sys.schemaのnameを使うと発生する謎の「メッセージ 8152、レベル 16、状態 2、行 8 文字列データまたはバイナリ データが切り捨てられます。」

/*
SQL Serverのバージョンによって動作が異なるのでメモをUP

異なるSQL Serverの一覧
SQL Server Version 互換レベル 現象の発生
------------------------------------------------------------
SQL Server 2012 SP3 2005~2012 問題なし
SQL Server 2016 SP1 CU2 2005~2016 エラーが発生
SQL Server 2016 SP1 CU6 2005~2016 エラーが発生

現象は、下記のクエリでエラーが発生する場合としない場合があります。
*/

begin tran
--drop table #tablelist
CREATE TABLE #tablelist (SchemaName VARCHAR (10));
SELECT max(len(s.[name])) FROM sys.schemas s JOIN sys.tables t ON s.schema_id=t.schema_id
--3
INSERT INTO #tablelist SELECT s.[name] FROM sys.schemas s JOIN sys.tables t ON s.schema_id=t.schema_id
/*
メッセージ 8152、レベル 16、状態 2、行 8
文字列データまたはバイナリ データが切り捨てられます。
ステートメントは終了されました。
そもそもinsert into selectで投入するデータの最大桁数は、3桁なのにエラーとなる。
これは、SQL Serverの欠陥と見ている。
*/
rollback tran

SELECT s.[name] FROM sys.schemas s
/*
dbo
guest
INFORMATION_SCHEMA
sys
db_owner
db_accessadmin
db_securityadmin
db_ddladmin
db_backupoperator
db_datareader
db_datawriter
db_denydatareader
db_denydatawriter

「INFORMATION_SCHEMA」があるために、#tablelistの桁が18桁必要のようです。
しかし、inner join(内部結合)でデータを持ってきていないので、本来はエラーとなるべきではない。
SQL Serverの不具合と見ています。
*/

2017年12月2日土曜日

SAP Crystal Reports Service Packを集めてみた

2017年11月28日火曜日

HTTP ERROR 503.2 同時要求の制限を超えています。 appConcurrentRequestLimit プロパティに、現在の同時要求数よりも低い値が設定されています。IIS 7.0、IIS 7.5、および IIS 8.0 では appConcurrentRequestLimit プロパティの値を超えた数の同時要求は許可されません。

エラーは、IISの同時接続数のようなので、上限をいじるとよいかと思います。

注意点として、requestQueueLimitの変更だけでは、別の上限(MaxConcurrentRequestsPerCPU)に引っかかる可能性がるので、留意が必要そうです。

1)アプリケーションプールのキュー長さを1000から65535に増やす
        Application Pool>詳細設定>詳細>全般>キューの長さ

2)Machine.Configの変更
     ProcessModel要素のrequestQueueLimitプロパティを100000に増やす

ASP.NET の要求のキュー制限を変更するには
1.hidemaru %systemroot%\Microsoft.Net\Framework64\v2.0.50727\CONFIG\machine.config
3.↓に属性を追加する
<system.web>
<processModel autoConfig="true"/>

<system.web>
<processModel autoConfig="true" requestQueueLimit="100000"/>

3)↓の実行によってappConcurrentRequestLimitが10000に増加させる
 
    C:\Windows\System32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

追記:デフォルト値の変更について(公式)
    https://blogs.msdn.microsoft.com/tmarq/2007/07/20/asp-net-thread-usage-on-iis-7-5-iis-7-0-and-iis-6-0/

    マイクロソフトの推奨は、
        CPUあたりの同時要求数をレジストリでいじる
        HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0内のMaxConcurrentRequestsPerCPU

        >読んでいったら、.net 3.5からは、MaxConcurrentRequestsPerCPUもconfigに記載ができる。
        <system.web> 
            <applicationPool maxConcurrentRequestsPerCPU = "12" maxConcurrentThreadsPerCPU = "0" requestQueueLimit = "5000" /> 
        </system.web>

英語のエラーは、
HTTP Error 503.2 - Service Unavailable
The serverRuntime@appConcurrentRequestLimit setting is being exceeded.


2017年11月27日月曜日

System.Net.WebException: リモート サーバーがエラーを返しました: (413) Request Entity Too Large

1)WCFのエラーが発生し、調査依頼が届いた

System.Net.WebException: リモート サーバーがエラーを返しました: (413) Request Entity Too Large

   場所 System.Net.HttpWebRequest.GetResponse()
   場所 apiTester.ApiTestForm.buttonGo_Click(Object sender, EventArgs e) 場所 D:\dev\sample\20171125_jsonペイロードエラー\apiTester\ApiTestForm.cs:行 513

2)解決策:Web.configに追加した内容

  <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
    </scripting>
  </system.web.extensions>

3)jsonで64KBが送信できないって相談が来て調査した。
newtonsoftのライブラリとASP.NET MVCかな?って思って、↓を回答したのですが、現象が解決せず、サーバのconfigを見たら、WCFを使っていた。

>>・Web.Configに以下を追加
>><appSettings>
>>     <!-- Jsonデータ送信時のkeyとvalueのペア数制限の最大値-->
>>     <add key="aspnet:MaxJsonDeserializerMembers" value="1000000" />
>></appSettings>

WCFでは、大きなメッセージでのサービス攻撃を回避するためにメッセージを65KBに制限しています。また、MTOMを使用しない場合は、byte []をbase64でエンコードされた文字列(サイズが33%増加)=> 48KB * 1,33 = 64KBに送信します。

この問題を解決するには、大きなメッセージを受け入れるようにサービスを再構成する必要があります。この問題は、以前は400 Bad Requestエラーを発生させましたが、新しいバージョンのWCFではこのタイプのエラーの正しいステータスコードである413を使用し始めました。

↓2009に読んだなぁ