如何确保所有 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;
我很少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;