Оператор удаления хранимой процедуры bigquery удаляет строки, которые не должны - PullRequest
0 голосов
/ 10 июля 2020

Когда я использую хранимую процедуру для выполнения оператора DELETE с предложением WHERE, предложение кажется игнорируемым.

Шаги для воспроизведения:

Создайте таблицу BQ

CREATE TABLE `[project].[dataset].test` (
   email STRING NOT NULL,
   providerId STRING NOT NULL
);

Добавить тестовые данные

insert into `[project].[dataset].test` (email, providerId) values ('test.email@gmail.com', 'test1');
insert into `[project].[dataset].test` (email, providerId) values ('test.email@gmail.com', 'test2');

Создать хранимую процедуру, которая принимает email и providerId в качестве входных

CREATE OR REPLACE PROCEDURE `[project].[dataset].RemovePermission`(IN providerId STRING, IN email STRING)
BEGIN
  DELETE FROM `[project].[dataset].test` p
  WHERE       p.email = email
              AND p.providerId = providerId;
END;

Выполнить хранимую процедуру

CALL [project].[dataset].RemovePermission('test1', 'test.email@gmail.com`)

Обратите внимание, что в ответе удалены 2 строки, а тестовая таблица теперь пуста.

И наоборот, если вы выполняете удаление вручную, как показано ниже, удаляется только 1 строка - это это правильное поведение.

DELETE FROM `[project].[dataset].test` p
  WHERE       p.email = 'test.email@gmail.com'
              AND p.providerId = 'test1';

Что я делаю не так?

1 Ответ

1 голос
/ 10 июля 2020

Имена аргументов email, providerId «конфликтуют» с именами столбцов email, providerId и, следовательно, WHERE p.email = email AND p.providerId = providerId ВСЕГДА true

Просто измените имя аргумента, и оно должно работать должным образом. Что-то вроде

CREATE OR REPLACE PROCEDURE `project.dataset.RemovePermission`(IN Id STRING, IN txt STRING)
BEGIN
  DELETE FROM `project.dataset.test` p
  WHERE p.email = txt
  AND p.providerId = Id;
END;
...