Повреден лог в SQL Server Express

В случай, че база не може да се закачи към SQL Server с подобна грешка:

и стандартната команда с ATTACH_REBUILD_LOG не работи, може да се използва ATTACH_FORCE_REBUILD_LOG, която ще създаде лог-а при всички ситуации.


Взето от тук:

https://blog.sqlauthority.com/2016/11/04/sql-server-unable-attach-database-file-activation-failure-log-cannot-rebuilt/

Parameter sniffing или защо понякога заявките в SSMS са бързи, а в приложението не

SQL Server има оптимизация, която се нарича parameter sniffing, която запазва и кешира query планове при извикване и компилиране на stored procedure за конкретни параметри.

По подразбиране .NET приложенията използват малко по-различни параметри отколкото SSMS например:

За приложения:

за SSMS:

Съответно в някои случаи заявките се оптимизират грешно за .NET приложения (с arithabort off), но в SSMS работят наред, тъй като няма натрупана статистика, за да се оптимизират.

Бързо решение на проблема (временно!) е да се изпълни

Това изчиства кеша на сторнатите процедури и започва наново да се съхраняват. Тези статистики се пазят в паметта, поради което рестарт на сървъра също върши работа.

Има и други опции, като да се добавят различни опции към заявката като use recompile, option recompile, optimize for unknown и т.н.

По-глобално решение би било използването на Trace flag 4136 или

По-долу има подробна информация за този (и други случаи) и различни решения на проблема:

http://www.sommarskog.se/query-plan-mysteries.html

Сериозен недостатък при .NET приложения и EF е генерирането на  dynamic SQL, който използва sp_executesql и лесно може да възникне такъв проблем.

Tile Server за OpenStreetMaps

OpenStreetMaps са прекрасни карти, които са безплатни за  използване, могат да се редактират от всеки и допускат да се изтеглят сурови данни.

За да се използват данните е нужен “tile server”, който да ги предоставя. Стандартните mapnik и т.н. са много добри, но и сложни за подкарване.

Тук идва Tile Server GL – лесен за инсталиране като npm пакет или docker контейнер. NPM пакета съществува и в разновидност, която е изцяло javascript (без растер) и включва node сървър.

За работа са необходими mbtiles карти например от OpenMapTiles

Цялото подкарване отнема по-малко от 5 мин и след това it just works 🙂

Генериране на Nuget пакет и качване в локално хранилище

Бърз начин за генериране на nuget пакет и Upload към локално (shared folder) хранилище

 

Криптиране на връзката към MS SQL Server

Бърз начин за осигуряване на криптирана връзка по пътя (data at transit) до MS SQL server е използването на SSL сертификати от сървърна страна.

Ако не може да се издаден валиден SSL сертификат или няма възможност за локален CA, то може да се добави TrustServerCertificate=Yes към connection string-a към базата, за да вярва на сървърния сертификат.

Разбира се по този начин осигуряваме криптирана връзка с лесна конфигурация на цената на риска от използването на self-signed сертификат.

 

Криптиране на конфигурационни файлове в ASP.NET

Криптиране на connectionStrings секцията в web.config използвайки DPAPI. Командата трябва да се изпълни на машината, където е сървъра, защото използва данни от machine.config

и съответно декриптиране на секцията

 

Конфигуриране на TDE за SQL Server

SQL скрипт за създаване на TDE (Transparent Data Encryption) и осигуряване на “Encrypt the data at rest”.

Информацията в базата данни е криптирана и ако някой намери backup на базата няма да може да я използва.

Друга положителна страна е, че приложението,което достъпва данните няма нужда се променя и продължава да работи както и досега.

Криптирането на базата е онлайн, прозрачно и може да се проследи до къде е стигнало чрез изпълнение на query към dmv таблица.

Важно е да се запазят ключовете и сертификата, за да може базата данни да се прочете, ако се премести на друг сървър!

 

 

SQL Server 2016/2017 – MS 70-761 Querying data with T-SQL

Подготовката за изпит MS 70-761 Querying data with Transact-SQL задължително минава през новостите в SQL Server 2016, като част от тях  са:

  • Dynamic Data Masking
  • Row Level Security
  • Always encrypted
  • Temporal data
  • JSON support
  • Polybase

Долните са по-скоро административни, но така или иначе са полезни

  • Query Store
  • Stretch Database

ASP.NET Core encoding на кирилица като UTF-8

По подразбиране в ASP.NET Core 1.0/1.1 при визуализация на кирилица (всичко non Latin) в сорс-а на страницата се появява нещо подобно на това:

Това затруднява дебъгването и увеличава размера на страницата. По-странното е, че текст написан на кирилица в cshtml-a се показва правилно както е изписан.

Мислех, че е проблем с encoding-а на страницата или контролера или нещо друго, но всичко беше настроено на UTF-8.

В крайна сметка попаднах на дискусия в github: https://github.com/aspnet/HttpAbstractions/issues/315 . Там се обяснява, че по подразбиране се кодира в BasicLatin и съответно всичко останало се променя до UTF-8 като по-горе.

Решението е, да се добави следния код в Startup.cs:

Така и не ми стана ясно, защо default-a e BasicLatin, но вероятно има някаква важна причина, която в момента ми убягва

 

Одитиране на заявки с ASP.NET Core

Лесен начин за одитиране на заявки с ASP.NET Core компилиран от няколко различни сайта и модифициран да работи с Core

Няколко неща, които си заслужава да бъдат обяснени:

Използваме стандартното ASP.NET Core cookie, за да установим нещо като сесия за потребителя. Така получаваме всички действия извършени в хубав хронологичен ред.

Целта да прихванем и OnResultExecuted е да запишем колко време е отнело да се изпълни метода (полезно за разрешаване на проблеми от сорта на “Много е бавно”)

С предаване на параметри може да решим колко детайлно да запазим информация за съответния метод – параметри, query strings и т.н.

Използва се по следния начин в базовия controller (прави се по този начин, за да може да извикаме атрибута хем с DI, хем без параметри)

Допълнително разполагаме с property AuditId, което показва Id на съответния одит запис, в случай че искаме да добавим допълнителна информация в тялото на метода.

 

Например по следния начин: