Как перехватить каждый SQL звонок, сделанный через. net Entity Framework 6.2 - PullRequest
0 голосов
/ 18 февраля 2020

Глядя, чтобы захватывать и регистрировать все обращения к БД, сделанные структурой сущностей. Какой лучший способ сделать это? это лучший способ https://www.entityframeworktutorial.net/entityframework6/database-command-interception.aspx?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

ССЫЛКА: Ведение журнала и перехват операций с базой данных

Вы можете установить context.Database.Log на Console.Write:

using (var context = new BlogContext())
{
    context.Database.Log = Console.Write;

    var blog = context.Blogs.First(b => b.Title == "One Unicorn");

    blog.Posts.First().Title = "Green Eggs and Ham";

    blog.Posts.Add(new Post { Title = "I do not like them!" });

    context.SaveChangesAsync().Wait();
}

Это приведет к следующему выводу:

SELECT TOP (1)
    [Extent1].[Id] AS [Id],
    [Extent1].[Title] AS [Title]
    FROM [dbo].[Blogs] AS [Extent1]
    WHERE (N'One Unicorn' = [Extent1].[Title]) AND ([Extent1].[Title] IS NOT NULL)
-- Executing at 10/8/2013 10:55:41 AM -07:00
-- Completed in 4 ms with result: SqlDataReader

SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[Title] AS [Title],
    [Extent1].[BlogId] AS [BlogId]
    FROM [dbo].[Posts] AS [Extent1]
    WHERE [Extent1].[BlogId] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int32)
-- Executing at 10/8/2013 10:55:41 AM -07:00
-- Completed in 2 ms with result: SqlDataReader

UPDATE [dbo].[Posts]
SET [Title] = @0
WHERE ([Id] = @1)
-- @0: 'Green Eggs and Ham' (Type = String, Size = -1)
-- @1: '1' (Type = Int32)
-- Executing asynchronously at 10/8/2013 10:55:41 AM -07:00
-- Completed in 12 ms with result: 1

INSERT [dbo].[Posts]([Title], [BlogId])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[Posts]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
-- @0: 'I do not like them!' (Type = String, Size = -1)
-- @1: '1' (Type = Int32)
-- Executing asynchronously at 10/8/2013 10:55:41 AM -07:00
-- Completed in 2 ms with result: SqlDataReader
0 голосов
/ 18 февраля 2020

Вы можете захватить его из БД через sys.processes

    With AllJobsRan(SPID,LastBatch,SourceProgram,HostName,LoginCredentials, script)
    as (
    select
        P.spid
    ,   P.last_batch
    ,   P.program_name
    ,   P.hostname
    ,   P.loginame
    ,   sql_handle
    from master.dbo.sysprocesses P
    where 
    --and      P.status not in ('background', 'sleeping')
    --and      P.cmd not in ('AWAITING COMMAND'
                        --,'MIRROR HANDLER'
                        --,'LAZY WRITER'
                        --,'CHECKPOINT SLEEP'
                        --,'RA MANAGER')
                        -- AND 
                        p.last_batch > '2/17/2020'
                        AND p.last_batch < '2/18/2020'
    ),
    Scripts(byteScript)
    as (
        select script from AllJobsRan
    )
select  
    AllJobsRan.SPID,
    AllJobsRan.LastBatch,
    AllJobsRan.HostName,
    AllJobsRan.LoginCredentials,
    LEN([SQLText].text) as [ScriptLength],
    [SQLText].text from AllJobsRan 
CROSS APPLY 
    sys.dm_exec_sql_text(AllJobsRan.[script]) as [SQLText]
order by 
    LastBatch,[ScriptLength] desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...