Оператор INSERT для SYNONYM не выполняется в SQL Server;есть идеи? - PullRequest
0 голосов
/ 20 сентября 2018

У нас есть приложение-служба C # WCF, которое использует log4net для записи запросов веб-службы в таблицу.Чтобы разгрузить трафик от извлечения данных клиентов, мы создали зеркало основной базы данных и указали на него наше приложение.Однако нам нужно убедиться, что записи журнала записываются в основную базу данных, поэтому в зеркале мы удаляем таблицу журнала и заменяем ее на SYNONYM, который указывает на «настоящую» таблицу в главной базе данных.

Что-то странное происходит.

При указании на главную базу данных, содержащую реальную таблицу, оператор INSERT работает нормально, и записи журнала публикуются.

Однако, когда он указывает на зеркальную базу данных, содержащуюсиноним, указывающий на фактическую таблицу, кажется, что INSERT работает (без исключений), но запись никогда не вставляется.

Мы можем видеть, что фактический оператор выполняется в SQL Profiler, и это один и тот же оператор в обоихслучаи;однако один фактически вставляет запись, а другой - нет.

Есть идеи, почему один и тот же код будет работать по-разному для вставки в таблицу в отличие от синонима базы данных?

То, что мы пробовали:

  • Мы проверили, что операторы INSERT для SYNONYM работают в SSMS: запись вставляется в основную таблицу.
  • Мы попытались извлечь только код, чтобы вставить запись, и выложить еево втором приложении.Вставка работает и в этом тестовом приложении, добавляя запись в основную таблицу.
  • Мы попытались установить для свойства UseTransactions объекта AdoNetAppender значение false.Все еще работал против реальной таблицы и не работал против синонима.

У нас нет идей здесь.Справка!

Схема таблицы в базе данных master:

CREATE TABLE [Osha].[Log](
    [ID] [INT] IDENTITY(1,1) NOT NULL,
    [Sequence] [BIGINT] NOT NULL,
    [LastUpdated] [DATETIME] NOT NULL,
    [LastUpdatedBy] [INT] NOT NULL,
    [Process] [NVARCHAR](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Date] [DATETIME] NOT NULL,
    [Thread] [NVARCHAR](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Level] [NVARCHAR](25) COLLATE SQL_Latin1_General_CP1_CS_AS NULL,
    [Logger] [NVARCHAR](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [User] [NVARCHAR](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [RequestID] [NVARCHAR](36) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Event] [NVARCHAR](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Message] [NVARCHAR](MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Property] [NVARCHAR](MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Exception] [NVARCHAR](MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [O_Log_pk_ID] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Синоним SQL:

CREATE SYNONYM [Osha].[Log] FOR [Test].[Osha].[Log]

SQL выполняется для обоих:

exec sp_executesql N'insert into [Osha].[Log] ([LastUpdatedBy], [Process], [Date], [Thread], [Level], [Logger], [User], [RequestID], [Event], [Message], [Property], [Exception]) values (1, ''d9a930b2-f29a-4764-89a0-1f3d7b6fb30a'', @Date, @Thread, @Level, @Logger, case when substring(@Message, 1, 5) = ''User:'' then substring(@Message, 7, charindex(char(13), @Message) - 7) else null end, case when substring(@Message, charindex(char(13), @Message) + 2, 10) = ''RequestID:'' then substring(@Message, charindex(char(13), @Message) + 13, 36) else null end, case when substring(@Message, charindex(char(13), @Message) + 51, 6) = ''Event:'' then substring(@Message, charindex(char(13), @Message) + 58, charindex(char(13), substring(@Message, charindex(char(13), @Message) + 59, 2147483647))) else null end, @Message, @Property, @Exception)',N'@Date datetime,@Thread nvarchar(255),@Level nvarchar(5),@Logger nvarchar(255),@Message nvarchar(max) ,@Property nvarchar(max) ,@Exception nvarchar(max) ',@Date='2018-09-20 16:32:44.663',@Thread=N'10',@Level=N'INFO',@Logger=N'blahblah',@Message=N'blahblach',@Property=N'{log4net:UserName=IIS APPPOOL\OshaTest, log4net:Identity=}',@Exception=N''

Вот план в основной базе данных:

Clustered Index Insert(OBJECT:([Test].[Osha].[Log].[O_Log_pk_ID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_UserDateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_UserLevelDateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_RequestIDDateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_DateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_LevelDateID]), SET:([Test].[Osha].[Log].[LastUpdatedBy] = [Expr1003],[Test].[Osha].[Log].[Process] = [Expr1004],[Test].[Osha].[Log].[Date] = RaiseIfNullInsert([@Date]),[Test].[Osha].[Log].[Thread] = [Expr1005],[Test].[Osha].[Log].[Level] = [Expr1006],[Test].[Osha].[Log].[Logger] = [Expr1007],[Test].[Osha].[Log].[User] = [Expr1008],[Test].[Osha].[Log].[RequestID] = [Expr1009],[Test].[Osha].[Log].[Event] = [Expr1010],[Test].[Osha].[Log].[Message] = [@Message],[Test].[Osha].[Log].[Property] = [@Property],[Test].[Osha].[Log].[Exception] = [@Exception],[Test].[Osha].[Log].[ID] = [Expr1002],[Test].[Osha].[Log].[Sequence] = RaiseIfNullInsert([Expr1011]),[Test].[Osha].[Log].[LastUpdated] = RaiseIfNullInsert([Expr1012]))) 0            0                         Clustered Index Insert Insert         OBJECT:([Test].[Osha].[Log].[O_Log_pk_ID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_UserDateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_UserLevelDateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_RequestIDDateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_DateID]), OBJECT:([Test].[Osha].[Log].[O_Log_ix_LevelDateID]), SET:([Test].[Osha].[Log].[LastUpdatedBy] = [Expr1003],[Test].[Osha].[Log].[Process] = [Expr1004],[Test].[Osha].[Log].[Date] = RaiseIfNullInsert([@Date]),[Test].[Osha].[Log].[Thread] = [Expr1005],[Test].[Osha].[Log].[Level] = [Expr1006],[Test].[Osha].[Log].[Logger] = [Expr1007],[Test].[Osha].[Log].[User] = [Expr1008],[Test].[Osha].[Log].[RequestID] = [Expr1009],[Test].[Osha].[Log].[Event] = [Expr1010],[Test].[Osha].[Log].[Message] = [@Message],[Test].[Osha].[Log].[Property] = [@Property],[Test].[Osha].[Log].[Exception] = [@Exception],[Test].[Osha].[Log].[ID] = [Expr1002],[Test].[Osha].[Log].[Sequence] = RaiseIfNullInsert([Expr1011]),[Test].[Osha].[Log].[LastUpdated] = RaiseIfNullInsert([Expr1012]))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   1            0.06         6E-006       9            0.0600075                                                                                                                                                        PLAN_ROW     0            1                  
  |--Top(TOP EXPRESSION:((1)))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             0            1            0            Top                    Top            TOP EXPRESSION:((1))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 1            0            1E-007       1209         1.457E-006       [Expr1002], [Expr1003], [Expr1004], [Expr1005], [Expr1006], [Expr1007], [Expr1008], [Expr1009], [Expr1010], [Expr1011], [Expr1012]              PLAN_ROW     0            1                  
       |--Compute Scalar(DEFINE:([Expr1003]=(1), [Expr1004]=N'7524a82f-a8f7-47bc-ad2c-2674dd3a2fb8', [Expr1005]=CONVERT_IMPLICIT(nvarchar(250),[@Thread],0), [Expr1006]=CONVERT_IMPLICIT(nvarchar(25),[@Level],0), [Expr1007]=CONVERT_IMPLICIT(nvarchar(250),[@Logger],0), [Expr1008]=CONVERT_IMPLICIT(nvarchar(250),CASE WHEN substring([@Message],(1),(5))=N'User:' THEN substring([@Message],(7),charindex(N'
',[@Message])-(7)) ELSE NULL END,0), [Expr1009]=CONVERT_IMPLICIT(nvarchar(36),CASE WHEN substring([@Message],charindex(N'
',[@Message])+(2),(10))=N'RequestID:' THEN substring([@Message],charindex(N'
',[@Message])+(13),(36)) ELSE NULL END,0), [Expr1010]=CONVERT_IMPLICIT(nvarchar(250),CASE WHEN substring([@Message],charindex(N'
',[@Message])+(51),(6))=N'Event:' THEN substring([@Message],charindex(N'
',[@Message])+(58),charindex(N'
',substring([@Message],charindex(N'
',[@Message])+(59),(2147483647)))) ELSE NULL END,0), [Expr1011]=[Test].[Osha].[CurrentSequence](), [Expr1012]=getdate()))                                                                                                                                                       0            2            1            Compute Scalar         Compute Scalar DEFINE:([Expr1003]=(1), [Expr1004]=N'7524a82f-a8f7-47bc-ad2c-2674dd3a2fb8', [Expr1005]=CONVERT_IMPLICIT(nvarchar(250),[@Thread],0), [Expr1006]=CONVERT_IMPLICIT(nvarchar(25),[@Level],0), [Expr1007]=CONVERT_IMPLICIT(nvarchar(250),[@Logger],0), [Expr1008]=CONVERT_IMPLICIT(nvarchar(250),CASE WHEN substring([@Message],(1),(5))=N'User:' THEN substring([@Message],(7),charindex(N'
',[@Message])-(7)) ELSE NULL END,0), [Expr1009]=CONVERT_IMPLICIT(nvarchar(36),CASE WHEN substring([@Message],charindex(N'
',[@Message])+(2),(10))=N'RequestID:' THEN substring([@Message],charindex(N'
',[@Message])+(13),(36)) ELSE NULL END,0), [Expr1010]=CONVERT_IMPLICIT(nvarchar(250),CASE WHEN substring([@Message],charindex(N'
',[@Message])+(51),(6))=N'Event:' THEN substring([@Message],charindex(N'
',[@Message])+(58),charindex(N'
',substring([@Message],charindex(N'
',[@Message])+(59),(2147483647)))) ELSE NULL END,0), [Expr1011]=[Test].[Osha].[CurrentSequence](), [Expr1012]=getdate())                                                                                                                                                         [Expr1003]=(1), [Expr1004]=N'7524a82f-a8f7-47bc-ad2c-2674dd3a2fb8', [Expr1005]=CONVERT_IMPLICIT(nvarchar(250),[@Thread],0), [Expr1006]=CONVERT_IMPLICIT(nvarchar(25),[@Level],0), [Expr1007]=CONVERT_IMPLICIT(nvarchar(250),[@Logger],0), [Expr1008]=CONVERT_IMPLICIT(nvarchar(250),CASE WHEN substring([@Message],(1),(5))=N'User:' THEN substring([@Message],(7),charindex(N'
',[@Message])-(7)) ELSE NULL END,0), [Expr1009]=CONVERT_IMPLICIT(nvarchar(36),CASE WHEN substring([@Message],charindex(N'
',[@Message])+(2),(10))=N'RequestID:' THEN substring([@Message],charindex(N'
',[@Message])+(13),(36)) ELSE NULL END,0), [Expr1010]=CONVERT_IMPLICIT(nvarchar(250),CASE WHEN substring([@Message],charindex(N'
',[@Message])+(51),(6))=N'Event:' THEN substring([@Message],charindex(N'
',[@Message])+(58),charindex(N'
',substring([@Message],charindex(N'
',[@Message])+(59),(2147483647)))) ELSE NULL END,0), [Expr1011]=[Test].[Osha].[CurrentSequence](), [Expr1012]=getdate() 1            0            1E-007       1209         1.357E-006       [Expr1002], [Expr1003], [Expr1004], [Expr1005], [Expr1006], [Expr1007], [Expr1008], [Expr1009], [Expr1010], [Expr1011], [Expr1012]              PLAN_ROW     0            1                  
            |--Compute Scalar(DEFINE:([Expr1002]=getidentity((1408776126),(5),NULL)))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      0            3            2            Compute Scalar         Compute Scalar DEFINE:([Expr1002]=getidentity((1408776126),(5),NULL))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             [Expr1002]=getidentity((1408776126),(5),NULL)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     1            0            1E-007       11           1.257E-006       [Expr1002]                                                                                                                                      PLAN_ROW     0            1                  
                 |--Constant Scan           

Я даже не вижу план в зеркальной базе данных ...

1 Ответ

0 голосов
/ 21 сентября 2018

Было исключение, которое мы пропустили, которое я обнаружил, когда включил просмотр ошибок в Profiler.

The INSERT permission was denied on the object 'Log', database 'TestMirror', schema 'Osha'.

Я предполагаю, что что-то ловило его и не передавало нам.

Спасибо @RBarryYoung, @ user2864740 и @ user1443098 за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...