Posted in: Vývoj počítačů, Windows server

Upgrade MS SQL serveru

Možné scénáře upgrade MS SQL serveru ve své přednášce popisuje Marek Chmel, přednáška je k dispozici na: SQL Server Bootcamp 2018: Upgrade SQL Serveru | Záznamy | Windows User Group – Czech Republic

Před Upgrade

  • Záloha všech databází
  • záloha loginů pomocí sp_help_revlogin
  • Záloha nastavení serveru

Po upgrade

V případě inplace upgrade je potřeba zkontrolovat a případně opravit:

  • Nastavení síťové komunikace, ztratilo se mi nastavení z obrázku
    Nastavení portu 1433 na IPALL
  • Zkontrolovat nastavení šifrování a připojení a nastavit dle možností aplikace
  • Zkontrolovat loginy

sp_help_revlogin

Volání:

USE master
GO
EXEC sp_help_revlogin

Založení, pokud neexistuje

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
  DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
    @binvalue varbinary(256),
    @hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
  DECLARE @tempint int
  DECLARE @firstint int
  DECLARE @secondint int
  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
  SELECT @firstint = FLOOR(@tempint/16)
  SELECT @secondint = @tempint - (@firstint*16)
  SELECT @charvalue = @charvalue +
    SUBSTRING(@hexstring, @firstint+1, 1) +
    SUBSTRING(@hexstring, @secondint+1, 1)
  SELECT @i = @i + 1
END

SELECT @hexvalue = @charvalue
GO
 
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
  DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary  varbinary (256)
DECLARE @PWD_string  varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr  varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)

DECLARE @defaultdb sysname
 
IF (@login_name IS NULL)
  DECLARE login_curs CURSOR FOR

      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
  DECLARE login_curs CURSOR FOR


      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
  PRINT 'No login(s) found.'
  CLOSE login_curs
  DEALLOCATE login_curs
  RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
  IF (@@fetch_status <> -2)
  BEGIN
    PRINT ''
    SET @tmpstr = '-- Login: ' + @name
    PRINT @tmpstr
    IF (@type IN ( 'G', 'U'))
    BEGIN -- NT authenticated account/group

      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
    END
    ELSE BEGIN -- SQL Server authentication
        -- obtain password and sid
            SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
        EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
        EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
 
        -- obtain password policy state
        SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
        SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
 
            SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'

        IF ( @is_policy_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
        END
        IF ( @is_expiration_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
        END
    END
    IF (@denylogin = 1)
    BEGIN -- login is denied access
      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
    END
    ELSE IF (@hasaccess = 0)
    BEGIN -- login exists but does not have access
      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
    END
    IF (@is_disabled = 1)
    BEGIN -- login is disabled
      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
    END
    PRINT @tmpstr
  END

  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
   END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO

Záloha konfigurace serveru

Stejně jako u sp_help_revlogin stačí pro vytvoření zálohy uložit výstup a na novém serveru výstup spustit.

SELECT 'EXEC sp_configure ''' + name + ''', ' + CAST(value AS VARCHAR(100))
FROM sys.configurations
ORDER BY name
Posted in: Vývoj počítačů

Změna znakové sady MS SQL serveru

V tomto článku bych se rád podělil o zkušenost se změnou znakové sady MS SQL serveru. Je několik cest, některé jsou dokumentované a podporované, jiné nikoliv.

Seznam podporovaných a výchozích znakových sad je možné najít v dokumentaci.

Změna znakové sady uživatelské databáze

V rámci instance MS SQL serveru je možné měnit collation pouze jedné databáze, nebo její části. K tomu slouží dokumentovaná a podporovaná cesta s využitím jazyka T-SQL. Ukažme si to na příkladu databáze jménem Products. Jako první bod je dobré vědět, jaká je stávající callation databáze, což nám vypíš příkaz:

SELECT name, collation_name FROM sys.databases WHERE name = 'Products'
--pro celý server můžeme použít
SELECT CONVERT(nvarchar(128), SERVERPROPERTY('collation'));

Nyní můžeme přistoupit k samotné změně na kódování Czech_CI_AS, což provedeme následujícím skriptem:

-- přepneme databázi do jednouživatelského módu 
ALTER DATABASE Products SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
-- změníme kódování
ALTER DATABASE Products COLLATE Czech_CI_AS; 
-- Vrátíme databázi do plnohodnotného režimu 
ALTER DATABASE Products SET MULTI_USER

Nyní máme hotovo. Tato změna má dopad na celou jednu databázi, ostatní neovlivňuje a nastavení serveru také nemění. Bez problémů funguje na všech verzích od 2005 po 2022.

Změna collation pouze jednoho sloupce

Pokud budeme potřebovat překódovat jen jeden sloupec databáze i to je možné. Je to velmi jednoduchý jeden řádek T-SQL kódu, opět si ukážeme příklad:

ALTER TABLE ProductGuid ALTER COLUMN Description nvarchar(1000) COLLATE Czech_CI_AS

Změna znakové sady serveru

Nyní si popíšeme cestu, jak změnit znakovou sadu serveru, neovlivní nastavení uživatelských databází. Tento postup je dokumentovaný Microsoftem a podporovaný.

Přejděte do složky, kde máte nainstalovaný SQL server a v ní do složky Setup Bootstrap.V této cestě spusťte příkazovou řádku, nebo PowerShell. Např..: C:\Program Files\Microsoft SQL server\140\Setup Bootstrap

V této cestě pak spustíme následující příkaz:

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL2017 /SQLSYSADMINACCOUNTS=ServerDB\wnd_rebuid /SAPWD= wnd_auth_sql2017 /SQLCOLLATION=Czech_CI_AS

V PowerShellu by to vypadalo následovně:

.\Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL2017 /SQLSYSADMINACCOUNTS=ServerDB\wnd_rebuid /SAPWD= wnd_auth_sql2017 /SQLCOLLATION=Czech_CI_AS

Výše uvedený příklad je pro Windows autentizaci, pokud budeme využívat SQL autentizaci, pak zadáváme login v jednoduchém tvaru.

Po dokončení příkazu máme hotovo, doporučuji restartovat instanci. Tato cesta funguje od verze 2008 R2.

Nedokumentovaná a nepodporovaná cesta

Tato cesta změní Callation celého serveru včetně všech uživatelských databází. Je velmi důležité mát kompletní zálohu a i tak mohu tento postup schválit jen pro testování, případně vývoj, nikoliv produkci.

Opět přejdeme k složky SQL serveru, přesněji k umístění souboru sqlserver.exe, například: C:\Program Files\Microsoft SQL server\MSSQL14.SQL2017\MSSQL\Binn

V této cestě opět spustíme příkazovou řádku jako správce. Nyní zastavíme všechny služby SQL serveru přes jeho řídící konzoli. Do příkazové řádky pak zadáme např.:

sqlservr -m -T4022 -T3659 -s"SQL2017" -q"Czech_CI_AS"

Význam parametrů je následující:

  • m: single user režim
  • T4022: Vynechání spouštěcích procedur
  • T3569: logování všech chyb při startu SQL serveru
  • s: název instance, pokud je pojmenovaná, pro default název není potřeba uvádět
  • q: požadovaná collation

Po dokončení procesu stiskneme CTRL + C a potvrdíme vypnutí serveru.

Nyní můžeme server pomocí management konzole spustit a máme nastavenou novou callation na všech databázích.

Postup je testován na verzi 2005 a novější.

Posted in: Studijní materiály, Vývoj počítačů

Správa SQL serveru

Dalším kurzem u kterého se můžeme v Globisu potkat je Správa Microsoft SQL serveru. I k tomuto kurzu zveřejňuji prezentaci a sadu některých skriptů, které se mohou hodit každému sysadminovi.

Balíček praktických skriptů obsahuje:
-Audit loginů
-Status zálohování
-Export konfigurace SQL serveru do Excelu
-Generování certifikátu pro šifrování databáze
-Přehled všech běžících XEventes
-Monitorování záloh
-Nastavení autentizace uživatelů
-Přehled šifrovaných DB
-Příklad rychlého zálohování
-Příklad obnovení certifikátu ze zálohy
-Proceduru Rev Login, která slouží k záloze, obnově a přenosu loginů včetně hesel
-Výpis účtů, které nemají rok měněné heslo
-Výpis účtů, které mají stejné heslo jako login
-Úplnou zálohu loginů
-Výpis událostí s popisem
-Výpis konfigurace serveru
-Zálohu konfigurace serveru

Skripty jsou většinou psané v T-SQL, ale některé jsou v PowerShellu.

Prezentace

Praktické skripty

Back to Top