Объемная вставка, SQL Server 2000, разрывы строки Unix

Чтобы добавить пользовательские атрибуты, вам нужно сделать три вещи:

  1. Добавить атрибуты в консоль администратора
  2. Добавить отображение претензий
  3. Требования к доступу
  4. g3]

Первый объясняется здесь довольно хорошо: http://www.keycloak.org/docs/3.3/server_admin/topics/users/attributes.html

Добавить сопоставление претензий:

  1. Открыть консоль администратора вашей области.
  2. Перейти к Клиентам и открыть своего клиента
  3. Это только работает для настроек> Тип доступа конфиденциальный или общедоступный (не только для канала)
  4. Перейти к Mappers
  5. Создать сопоставление вашего атрибута с json
  6. Проверить «Добавить to ID token "

Требования к доступу:

final Principal userPrincipal = httpRequest.getUserPrincipal();

if (userPrincipal instanceof KeycloakPrincipal) {

    KeycloakPrincipal kp = (KeycloakPrincipal) userPrincipal;
    IDToken token = kp.getKeycloakSecurityContext().getIdToken();

    Map otherClaims = token.getOtherClaims();

    if (otherClaims.containsKey("YOUR_CLAIM_KEY")) {
        yourClaim = String.valueOf(otherClaims.get("YOUR_CLAIM_KEY"));
    }
} else {
    throw new RuntimeException(...);
}

Надеемся, что это поможет и подходит вашему прецеденту. Я использовал это для пользовательского атрибута, который я добавил с помощью специальной темы.

34
задан Cade Roux 27 January 2009 в 00:50
поделиться

6 ответов

Благодаря всем, кто ответил, но я нашел свое предпочтительное решение.

, Когда Вы говорите SQL Server ROWTERMINATOR = '\n', он интерпретирует это как значение разделителя строк по умолчанию в соответствии с Windows, который является на самом деле "\r\n" (использующий нотацию C/C++). Если Ваш разделитель строк действительно просто "\n", необходимо будет использовать динамический SQL, показанный ниже.

DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT table_name
FROM ''C:\file.csv''
WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC (@bulk_cmd)

, Почему Вы не можете сказать BULK INSERT... (ROWTERMINATOR = CHAR (10)), вне меня. Не похоже, что можно оценить любые выражения в разделе WITH команды.

то, Что делает вышеупомянутое, создают строку команды и выполняют это. Аккуратно обходя потребность создать дополнительный файл или пройти дополнительные шаги.

14
ответ дан John Oxley 24 September 2019 в 06:22
поделиться

Одна опция состояла бы в том, чтобы использовать bcp и настроить файл управления с '\n' как символ разрыва строки.

, Хотя Вы указали, что предпочли бы не, другая опция будет состоять в том, чтобы использовать unix2dos, чтобы предварительно обработать файл в один с '\r\n' разрывы строки.

Наконец, можно использовать FORMATFILE опция на BULK INSERT. Это будет использовать файл управления BCP для определения формата импорта.

1
ответ дан ConcernedOfTunbridgeWells 24 September 2019 в 06:22
поделиться

Я думал бы, что "ROWTERMINATOR = '\n'" будет работать. Я предложил бы открыть файл в инструменте, который показывает "скрытые символы", чтобы удостовериться, что строка завершается как Вы, думают. Я использую блокнот ++ для вещей как это.

0
ответ дан BankZ 24 September 2019 в 06:22
поделиться

Это сводится к этому. Unix использует LF (ctrl-J), MS-DOS/Windows использует CR/LF (ctrl-M/Ctrl-J).

при использовании '\n' на Unix он переводится в символ LF. На MS-DOS/Windows это переводится в CR/LF. То, когда Ваш импорт работает на Unix, отформатировало файл, он видит только LF. Следовательно, его часто легче петлять через unix2dos сначала. Но поскольку Вы сказали в Вас исходный вопрос, Вы не хотите делать это (я предположу, что существует серьезное основание, почему Вы не можете).

, Почему не может Вы делать:

(ROWTERMINATOR = CHAR(10))

, Вероятно, потому что, когда код SQL анализируется, это не заменяет символ (10) символом LF (потому что это уже вмонтировано в корпус в одинарных кавычках). Или возможно то, что это было интерпретируемым как:

(ROWTERMINATOR =
     )

, Что происходит, когда Вы повторяете содержание @bulk_cmd?

0
ответ дан BIBD 24 September 2019 в 06:22
поделиться

Смотрит на меня существует два общих проспекта, которые могут быть взяты: некоторый альтернативный способ считать CSV в сценарии SQL или преобразовать CSV заранее с любым из многочисленных способов, которыми можно сделать это (BCP, unix2dos, если это - бывший король вещи, можно, вероятно, даже использовать редактор кода для фиксации файла для Вас).

, Но у Вас должен будет быть дополнительный шаг!

, Если этот SQL запускается из программы, Вы могли бы хотеть преобразовать окончания строки в той программе. В этом случае и Вы решаете кодировать преобразование сами, вот то, что необходимо не упустить: 1. Окончание строки могло бы быть \n 2. или \r\n 3. или даже \r (Mac!) 4. хорошее горе, могло случиться так, что некоторые строки имеют \r\n и других \n, любая комбинация возможна, если Вы не управляете, куда CSV прибыл от

хорошо, хорошо. Возможность 4 неправдоподобна. Это происходит в электронном письме, но это - другая история.

0
ответ дан Philippe Payant 24 September 2019 в 06:22
поделиться

Это немного сложнее! Когда вы указываете SQL Server ROWTERMINATOR = '\ n', он интерпретирует это как означающий терминатор строки по умолчанию в Windows, который на самом деле является «\ r \ n» (с использованием нотации C / C ++). Если ваш терминатор строки действительно просто "\ n", вам придется использовать динамический SQL, показанный выше. Я только что потратил большую часть часа, выясняя, почему \ n на самом деле не означает \ n при использовании с BULK INSERT!

2
ответ дан 27 November 2019 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: