bigquery 存储过程 delete 语句删除了它不应该删除的行
bigquery stored procedure delete statement removes rows it shouldn't
当我使用存储过程执行带有 WHERE
子句的 DELETE
语句时,该子句似乎被忽略了。
重现步骤:
创建 BQ table
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 行,测试 table 现在是空的。
相反,如果您手动执行删除,如下所示,只会删除 1 行 - 这是正确的行为。
DELETE FROM `[project].[dataset].test` p
WHERE p.email = 'test.email@gmail.com'
AND p.providerId = 'test1';
我做错了什么?
参数名称 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;
当我使用存储过程执行带有 WHERE
子句的 DELETE
语句时,该子句似乎被忽略了。
重现步骤:
创建 BQ table
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 行,测试 table 现在是空的。
相反,如果您手动执行删除,如下所示,只会删除 1 行 - 这是正确的行为。
DELETE FROM `[project].[dataset].test` p
WHERE p.email = 'test.email@gmail.com'
AND p.providerId = 'test1';
我做错了什么?
参数名称 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;