1. Databázové rozšíření

    Article: AN0001766Updated: 28.07.2018

    Systém ObjectGears lze pohodlně rozšiřovat také na úrovni databáze. Pro toto rozšíření existuje několik podpůrných uložených procedur a funkcí.

    Název Popis
    Get_AuthenticateUsersRoleCode Funkce vrátí konstantu s kódem role pro všechny přihlášené uživatele.
    Get_ReportRoleCode Funkce vrátí konstantu s kódem role pro reporty.
    Get_AllUsersRoleCode Funkce vrátí konstantu s kódem role pro všechny uživatele.
    Get_NoAuthenticateUsersRoleCode Funkce vrátí konstantu s kódem role pro všechny nepřihlášené uživatele.
    FindClassDef(@modelCode varchar(100), @classDefCode varchar(100)) Funkce vrátí ID třídy podle kódu modelu a třídy.
    FindColumnDbName( @classDefId int, @columnCode varchar(100)) Funkce vrátí databázový název sloupce podle zadaného ID třídy a kódu sloupce.
    FindColumnId(@classDefId int, @columnCode varchar(100)) Funkce podle ID třídy a kódu sloupce najde id sloupce.

     Funkce Get_...RoleCode použijte namísto natvrdo zadaného názvu ve Vašem kódu pro zajištění budoucí kompatibility.

    Použití funkcí pro přemapování na ID role (to může být v každé instanci jiné):

    select r.id, r.code
     from [role] r
     where r.Code = dbo.Get_AuthenticateUsersRoleCode()

     

    select r.id, r.code
     from [role] r
     where r.Code = dbo.Get_ReportRoleCode()

     

    Funkce FindClassDef a FindColumnDbName slouží pro získání ID třídy a databázového názvu sloupců. Tyto názvy je třeba pro dynamické vytvoření SQL na úrovni databáze tak, aby bylo přenositelné na jiné instance.

    ALTER PROCEDURE [dbo].[AddStatistics]
    AS
    BEGIN
     SET NOCOUNT ON;

     declare @m_code varchar(100)
     set @m_code = 'systemutil'

     Declare @date varchar(200)
     select @date = 'DateAdd(day, ' + cast( datepart( day, getdate()) as varchar(10)) + ' - 1, DateAdd(month, ' + cast( datepart( month, getdate()) as varchar(10)) + ' - 1, DateAdd(Year, ' + cast( datepart( year, getdate()) as varchar(10)) + ' - 1900, DateAdd(Hour, ' + cast( datepart( hour, getdate()) as varchar(10)) + ', DateAdd(Minute, ' + cast( datepart( minute, getdate()) as varchar(10)) + ', 0)))))'

     declare @clName varchar(50)
     declare @col_rowsName varchar(50)
     declare @col_total_space varchar(50)
     declare @col_total_used varchar(50)
     declare @sql varchar(max)
     declare @cl_id int

     --nacist cl
     set @cl_id = dbo.FindClassDef( @m_code, 'stat_system')
     set @col_rowsName = dbo.FindColumnDbName( @cl_id, 'rows')
     set @col_total_space = dbo.FindColumnDbName( @cl_id, 'total_space_kb')
     set @col_total_used = dbo.FindColumnDbName( @cl_id, 'total_used_space_kb')
     set @clName = 'DataRow' + cast( @cl_id as varchar(10))

     --spocitat pocet zaznamu
     set @sql = 'insert into ' + @clName + '(created, CreatedDataSourceId, Creator, ShortDescription, ' + @col_rowsName + ', ' + @col_total_space + ', ' + @col_total_used + ')
         select ' + @date + ', 4, ''SYSTEM'', t.name, p.rows, SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB
          from sys.tables t
           INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
           INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
           INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
           LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
          where t.type_desc = ''USER_TABLE''
           and t.name not in ( ''appversion'')
           and t.name not like ''datarow%''
           and t.name not like ''aspnet_%''
           and (t.name not like ''wp%'' or t.name = ''wpbase'')
           and s.Name = ''dbo''
          GROUP BY t.Name, s.Name, p.Rows'
     exec ( @sql)
     
    END

    View nebo uloženou proceduru můžete vytvořit také v případě, kdy by zjišťování informací pomocí objektů skriptů ObjectGears bylo pracné, výpočetně náročné nebo vedlo k násilnému ohýbání funkcionality. Nad daným View nebo Uloženou procedurou pak vytvoříte v ObjectGears Dotaz, který můžete filtrovat, řadit a dále používat, kde potřebujete.

×