• aaa

    Poznávačka krás Maďarska - toulání po severu 

  • CAT700

    Non-stop adventure závod přes Katalánsko - z Pyrenejí až k moři

  • Toulání Šumavou
    Toulání Šumavou

    Extrémní non-stop MTB závod

  • 1000 miles
    1000 miles

    Non-stop extrémní adventure závod napříč Československem by Jan Kopka

  • Bohemia Divide 2019

    Non-stop bike packing závod 700km dlouhý z nejjižnějšího do nejsevernějšího místa ČR 

A A A

Následující situace se mě stává celkem pravidelně, když instaluju Windows Server do virtuálního prostředí. Po instalaci nelze systém aktivovat resp.ani nelze zadat aktivační klíč

To se tak člověk někdy vychytá, když narazí na proceduru, kterou udělal někdo před ním ...

A to je ideální stav si vysvětlit rozdíl mezi @@IDENTITY a SCOPE_IDENTITY.

Obě tyto funkce vracejí ID posledního záznamu, který procedurou vytvoříme. Např. v proceduře použijeme příkaz, kterým vkládáme do určité tabulky data a následně potřebujeme zjistit ID posledního námi vloženého záznamu, abychom s ním mohli dále pracovat. ID posledního záznamu můžeme samozřejmě zjistit tím, že nad danou tabulkou zavoláme SELECT MAX (ID) FROM ..... nebo SELECT IDENT_CURRENT( 'Tabulka' )  Pozor, to nám ale vrátí poslední ID v tabulce, takže pokud někdo chvilku po nás udělá také INSERT do dané tabulky, budeme mít ID posledního záznamu a ne toho našeho vloženého, tedy není omezeno relací nebo scope.

Použijeme tedy jednu z výše uvedených funkcí, ale pozor na jejich fungování.

SCOPE_IDENTITY vrací ID posledního záznamu v dané transakci a daném scope, takže pouze z tabulky, do které děláme procedurou INSERT

Kdežto @@IDENTITY vrací ID posledního záznamu, kterým procedura ID vyvolá nějaký INSERT. Takže když je nad tabulkou TRIGGER, který udělá na základě vašeho Insertu také Insert (třeba i do jiné tabulky), tak dostanete ID toho záznamu vytvořeného triggem !!

Můžete si říci: dobře, já triggery používat nebudu. To si taky asi řekl ten, kdo udělal proceduru nad tabulkama, kde jsem já dodatečně vytvořil trigger :-) a pak jsem hledal, proč se mě přestaly správně dělat vazby nad záznamy, kde byl použit právě @@IDENTITY

Doporučením je tedy používat SCOPE_IDENTITY

 

 

Tímto skriptem lze v SQL databázi vyhledat objekty, ve kterých se objevuje určitá část kódu nebo příkaz. Např.nedávno jsem musel kvůli určitým změnám vyhledat a změnit procedury a trigery, kde je použit příkaz Raiserror.

SELECT OBJECT_NAME(object_id), definition
FROM sys.sql_modules
WHERE definition LIKE N'%Raiserror%'

Určitě jste někdy bádali nad tím, kdy byla naposledy updatovaná nějaká tabulka. Já dosti často u tabulek vytvářím 2 pole, jeden pro datum a čas insertu záznamu a druhý pro datum a čas posledního updatu. Jsou ale tabulky kde taková data nevyužijete a proto je tam nemáte a pak je třeba tyto informace zjišťovat jinak.

Níže  uvedený script vypíše některé zajímavé informace o tabulce vč.data posledního updatu. Ten je ve sloupci last_user_update

Vysvětlení příkazu: 

OBJECT_NAME(OBJECT_ID) - vrací název tabulky
DB_ID('NazevDB') - vrací ID databáze
OBJECT_ID('NazevTabulky') - vrací ID tabulky 

Pokud v klauzuli WHERE vynecháte název tabulky, vypíší se kompletně všechny tabulky v dané databázi  

USE [CvicnaDB]
GO

SELECT OBJECT_NAME(OBJECT_ID) AS NazevTabulky,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'CvicnaDB')
AND OBJECT_ID=OBJECT_ID('NypTabLogMailu')

 

Výsledek:

Původně to měla být kategorie o cestách, které podniknu na svém starém kole-dědkovi. Pak se mě název zalíbil a říkám si, že jednou budu taky dědek, vlastně syna už na to mám dost velkýho, a tak nadčasově tuto kategorii nechám pojmenovanou takto. Takže zde nalezneš zápisky z cest. 

Zde je můj blog o SQL. Je to takový můj tahák.

Moje poznámky z instalací

Search