如何确保所有 sql 语句都执行 else rollback

How to make sure all sql statements are executed else roolback

我很少SQL陈述。

copy into STG_PB(VAR,FILE_NAME, LINE_NUMBER) 
  from (
      select ,metadata$filename, metadata$file_row_number
      from @investor_stage_s3// 
)

delete from stg_pb1
insert into stg_pb1 values (....)

因此,我每天都会从 s3 获取大量数据并加载到数据库中。 在我的 SQL 语句中,我使用了删除语句,因此如果我在插入语句中遇到任何错误,我之前的所有数据都将丢失。如果发生错误,我如何确定回滚到以前的数据?

谢谢, 习

使用transactions

A transaction is a sequence of SQL statements that are processed as an atomic unit. All statements in the transaction are either applied (i.e. committed) or undone (i.e. rolled back) together.

Allowing Statement Errors to Abort Transactions:

To allow a statement error within a transaction to abort the transaction, set the TRANSACTION_ABORT_ON_ERROR parameter at the session or account level.

ALTER SESSION SET TRANSACTION_ABORT_ON_ERROR = TRUE;

BEGIN TRANSACTION;
-- DML 1
-- DML 2
COMMIT;

用 Snowflake 脚本块包装所有内容:

CREATE OR REPLACE TABLE t1(i INT);

EXECUTE IMMEDIATE $$
BEGIN
  BEGIN TRANSACTION;
  
  INSERT INTO t1 SELECT 1;
  INSERT INTO t1 SELECT 1/0;
  
  COMMIT;
  RETURN 'Success';
EXCEPTION
  WHEN OTHER THEN
  ROLLBACK;
  RETURN 'Error';
END;
$$;

SHOW TRANSACTIONS;
SELECT * FROM t1;