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.