Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
Доброго времени суток, дамы и господа

Вопрос такой: есть некая таблица, в которой нет первичного ключа (heap). В частности, это табличная часть документа из 1ски. И вот вопрос: есть ли какое - нибудь скрытое системное поле в таблице SQL, по которому всеж - таки можно было однозначно идентифицировать запись в этой таблице? Не знаю, может внутренний ГУИД какой - нибудь, или еще что - то...
9 авг 19, 09:53    [21945337]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
tunknown
Member

Откуда:
Сообщений: 665
ppa32
по которому всеж - таки можно было однозначно идентифицировать запись в этой таблице?
Если есть unique constraint, то по его полям и можно идентифицировать. Видимо, для административных целей можно и по положению на конкретной странице, но это сложно и, скорее всего, только до её модификации.
9 авг 19, 09:58    [21945343]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 103
SELECT %%physloc%%, *
FROM ...
9 авг 19, 09:58    [21945344]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1524
tunknown
Если есть unique constraint

Для табличных частей это код родителя и номер строки.
9 авг 19, 10:02    [21945348]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1011
Sergey Syrovatchenko
SELECT %%physloc%%, *
FROM ...


Для лучшего понимания я все же советовал бы sys.fn_PhysLocFormatter(%%physloc%%)
9 авг 19, 10:14    [21945363]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
Sergey Syrovatchenko,

Идея хорошая, но, к сожалению, 1ска перезаписывает табличную часть при изменении. Ну то есть если в документе было 4 строки:
0xE5FFB60001000500
0xE5FFB60001000600
0xE5FFB60001000700
0xE5FFB60001000800

Мы удаляем из интерфейса строку 0xE5FFB60001000700 и записываем документ, то в таблице будет вот так:
0xE5FFB60001000500
0xE5FFB60001000600
0xE5FFB60001000700
где 0xE5FFB60001000700 - это бывшая 0xE5FFB60001000800
9 авг 19, 10:17    [21945367]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11429
https://docs.microsoft.com/en-us/sql/t-sql/functions/checksum-agg-transact-sql?view=sql-server-2017
9 авг 19, 10:20    [21945370]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1011
ppa32, это не 1C-ка перезаписывает, это SQL Server.
Данная виртуальная колонка показывает значение физического расположения строки, но это физическое расположение может меняться во множестве случаев - ребилды, сжатия, разделение страниц при вставке, реорганизация и т.д.
9 авг 19, 10:21    [21945373]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
tunknown, юник констрейнт, к сожалению, ничего не даст: пара полей, которая в нем есть, при записи документа из интерфейса 1С перезаписывается, и, если кто - то убил строку из середины документа, то поля из убитой строки начинают соответствовать следующей строке документа, которая там была по списку.
9 авг 19, 10:22    [21945374]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1011
Konst_One
https://docs.microsoft.com/en-us/sql/t-sql/functions/checksum-agg-transact-sql?view=sql-server-2017

Если две строки идентичны - это значение также будет одинаковым.
ну и CHECKSUM_AGG - это агрегатная функция, вы, наверное, имели в виду CHECKSUM
9 авг 19, 10:26    [21945378]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11429
для отслеживания изменений в таблице применять
9 авг 19, 10:27    [21945380]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
tunknown
Member

Откуда:
Сообщений: 665
ppa32
tunknown, юник констрейнт, к сожалению, ничего не даст: пара полей, которая в нем есть, при записи документа из интерфейса 1С перезаписывается, и, если кто - то убил строку из середины документа, то поля из убитой строки начинают соответствовать следующей строке документа, которая там была по списку.
Если вам нужно сослаться на строку такой таблицы вне 1C, то можно закостылить. Если 1C не сильно сопротивляется триггерам, то можно сделать таблицу маппинга и зафиксировать в ней первое значение этой пары полей в качестве идентификатора дополнив текущим значением пары. Потом все соответствующие операции с основной таблицей нужно будет пробрасывать через этот маппинг. Накладные расходы велики, но результата можно добиться.
9 авг 19, 11:13    [21945425]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
1C Developer
Member

Откуда:
Сообщений: 28
ppa32, а что за задача стоит перед Вами?

Возможно ее следует решать на стороне 1С?

На всякий случай в 1С документ может быть записан, но не проведен, в этом случае данные в таблице будут, но использовать их или передавать куда-либо, возможно, не требуется.

А еще документ может быть помечен на удаление или еще 100 других бизнес-нюансов реализованных на стороне 1С...
9 авг 19, 11:40    [21945451]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6639
ppa32,

хэш подсчитайте. А как 1С находит нужный документ?
9 авг 19, 13:26    [21945575]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1524
Владислав Колосов,

По GUID документа, а строчку в табличной части по GUID документа и номеру строки.
9 авг 19, 13:35    [21945586]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6639
4d_monster,

ну так GUID и номер сроки и есть ключ в этой таблице.
9 авг 19, 14:52    [21945683]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1524
Владислав Колосов,

Автор (вероятно) хочет аналог IDENTITY, чтобы ещё и изменения отслеживать.
9 авг 19, 15:20    [21945712]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
uaggster
Member

Откуда:
Сообщений: 676
4d_monster
Владислав Колосов,

Автор (вероятно) хочет аналог IDENTITY, чтобы ещё и изменения отслеживать.

Автор, вероятно, хочет изменившиеся записи дергать и где-нибудь в хранилище обновлять.
И не знает, как это без ключа сделать.

Мне, кстати, это тоже интересно.
СТ на куче включить не получится.
9 авг 19, 16:16    [21945760]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28894
uaggster
Автор, вероятно, хочет изменившиеся записи дергать и где-нибудь в хранилище обновлять.
Если бы знать, что нужно автору?
Изменившиеся записи можно отслеживать триггером
9 авг 19, 18:27    [21945857]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8552
Что делал я (это НЕ для таблиц 1С, в адинЦэ я не шарю вообще):
1. Создаётся таблица журналирования - LOG - (RowId bigint identity, RowTime datetime, ActionId bigint, ActionType char(1) {I, D} , WhoCorr nvarchar() (user), ... sysuser nvarchar(), SourceServerNmae nvarchar(), SourceDataBaseName nvarchar(), Updated_fields_mask, далее идут поля исходной таблицы ....
2. На таблицу-LOG вешается триггер, который отслеживает ЧТО добавилось - нужен ТОЛЬКО для того, что бы при вставке записей в ЛОГирующую таблицу информации из триггеров наблюдаемой таблицы (Insert Delete, Update) проставлял на блок один ActionId, равный тому RowId, который для первой вставившейся записи, - это несущественно (при UPDATE записи"наблюдаемой" таблицы в LOG прилетают последовательно по две записи от UPDATE-триггера - одна из deleted, другая - из inserted) , но облегчает жизнь.
3. На наблюдаемую таблицу вешаются триггеры на insert, delete, update для записи в LOG-таблицу того, что нашлось в inserted и deleted...

LOG-таблица живёт в отдельной базе на том же инстансе.

Работает лет пять. Сервер напрягает не сильно, хотя строки ёмкие и их достаточно. Админ туда периодически лезет посмотреть. И мне иногда приходится "шерстить" когда вдруг(!) пропадают/меняются документы и "Ой!, оно само сломалось..." (предусмотрительно фиксируются не только логин/юзернэйм, но и ssid, connectionId, application_name,.... ,- там чего только не найдёшь ) . Мониторятся две таблицы: шапки документов и шапки платежей. Всё остальное уже можно отыскать по бэкапам зная примерно момент изменения (до этого, правда, я не доходил,- достаточно просто рассказать кто, что и как менял посекундно - народ охреневает и фигни больше не делает).

Год назад привернул "чистку LOG-таблиц" - еженощный JOB - удаляется всё, что старше двух (или трёх?) кварталов.

ВНИМАНИЕ! Этот вариант хорош только тогда, когда аппликаха (или хранимки) не занимаются "кривым" анализом значений Identity insert после вставки в "контролируемые" таблицы и т.п. ... У меня в одном из случаев наладить похожее протоколирование на продакшне повалились пустые документы. Хотя тесты разработчиков базы были норм ...

Ну и в конце концов - есть "отслеживание изменений" (но у меня так ни разу и не "сложилось")...
10 авг 19, 00:17    [21945999]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
FFFFFFFF
Member

Откуда:
Сообщений: 14
А что, самостоятельно добавить поле с identity нельзя? Это сломает работу 1-С?
10 авг 19, 11:50    [21946068]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
tunknown, нечто подобное можно сделать средствами 1с: создать поле в табличной части документа, которое никто не видит, и писать туда рандомный ГУИД, если оно не заполнено. Средставми 1с же и навесить триггер. В терминах 1с он называется "Подписка на событие". Но вопрос в том, что триггеры придется вешать для всех табличных частей, а хочется красивое универсальное решение.
12 авг 19, 02:24    [21946734]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
1C Developer,

Проблему и пытаюсь решить на стороне 1с, но вопрос в том, как отследить факт того, что из документа строчку удалили, и какую. Или добавили.

Суть задачи в том, чтобы создать полное логирование действий пользователей по всем базам, и консолидировать эту информацию со всех баз 1с в одной SQLной базейке. Потом дописать в 1с интерфейс к ней, и смотреть, кто, где, что, когда и в какой базе 1С поменял.
12 авг 19, 02:32    [21946736]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
4d_monster, в точку!
12 авг 19, 02:33    [21946737]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
SIMPLicity_, проблема в том, что таблиц, на которые нужно навесить триггеры, сотни в каждой базе 1с (табличные части дкоументов). И очень не хочется туда влазить. Добавить какие - то свои объекты, думаю, не страшно, а вот таблицы 1с лучше не трогать от греха.
12 авг 19, 02:36    [21946738]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
FFFFFFFF, добавлять придется в несколько сотен таблиц в каждой базе, и к тому же я не знаю, как это повлияет на скорость работы 1с. Видимо, они изначально сделали на куче в угоду скорострельности (хотя имхо странное решение)....
12 авг 19, 02:38    [21946739]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1524
ppa32,

В новых версиях 1С появился механизм хранения версий объектов. Посмотрите может быть подойдёт вам.
12 авг 19, 08:08    [21946765]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
Gator
Member

Откуда: Москва
Сообщений: 14672
Кто мешает заскриптовать ALTER TABLE tttt ADD COLUMN... для одной таблицы,
размножить (ещё одним скриптом) в другие таблицы (см. [INFORMATION_SCHEMA].[TABLES])
и выполнить?
12 авг 19, 09:43    [21946821]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
1C Developer
Member

Откуда:
Сообщений: 28
ppa32
tunknown, нечто подобное можно сделать средствами 1с: создать поле в табличной части документа, которое никто не видит, и писать туда рандомный ГУИД, если оно не заполнено. Средставми 1с же и навесить триггер. В терминах 1с он называется "Подписка на событие". Но вопрос в том, что триггеры придется вешать для всех табличных частей, а хочется красивое универсальное решение.


Вы можете оформить одну подписку на событие проведения на все документы, программно проверяя есть ли табличные части в данном виде документа и обрабатывать при необходимости.

Не забыть очищать ГУИД при копировании строки.

Единственная рутинная операция - обойти все табличные части и добавить новое поле - можно начать с нескольких бизнес значимых.
12 авг 19, 10:43    [21946870]     Ответить | Цитировать Сообщить модератору
 Re: Внутренний идентификатор таблицы  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
1C Developer, ага. Именно этого решения я и хотел избежать, чтобы не добавлять гуид в 100500 ТЧ документов :)
13 авг 19, 04:28    [21947624]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить