天道酬勤,学无止境

ddl

CREATE SCHEMA IF NOT EXISTS 引发重复键错误(CREATE SCHEMA IF NOT EXISTS raises duplicate key error)

问题 为了给出一些上下文,命令在一个任务内发出,许多任务可能同时从多个工作人员发出相同的命令。 每个任务都尝试创建一个 postgres 模式。 我经常收到以下错误: IntegrityError: (IntegrityError) duplicate key value violates unique constraint "pg_namespace_nspname_index" DETAIL: Key (nspname)=(9621584361) already exists. 'CREATE SCHEMA IF NOT EXISTS "9621584361"' Postgres 版本是 PostgreSQL 9.4rc1。 这是 Postgres 中的错误吗? 回答1 这在表和模式的IF NOT EXISTS实现中有点麻烦。 基本上,它们是一种 upsert 尝试,而 PostgreSQL 并没有干净地处理竞争条件。 这是安全的,但很丑。 如果架构正在另一个会话中同时创建但尚未提交,则它既存在又不存在,具体取决于您是谁以及您的外观。 其他事务不可能“看到”系统目录中的新模式,因为它是未提交的,所以它在pg_namespace的条目对其他事务是不可见的。 所以CREATE SCHEMA / CREATE TABLE试图创建它,因为就它而言,对象不存在。 但是

2021-09-20 11:32:52    分类:技术分享    postgresql   concurrency   ddl   catalog

动态构建用于创建触发器的 MySQL 代码(Dynamically constructing MySQL Code for creating a trigger)

问题 我正在尝试为 MySQL 数据库实现审计跟踪/日志记录。 现在我创建了一个“审计”数据库(我们称之为company_audit ),它将包含主数据库中某些表的“审计”副本。 (例如,对于company.customers我将创建company_audit.customers 。审计表将包含与原始表中完全相同的列。 我想使用触发器将原始表中的更改插入到审计表中,如下所示: DELIMITER $$ DROP TRIGGER IF EXISTS customers_history_AU$$ CREATE TRIGGER customers_history_AU AFTER UPDATE ON customers FOR EACH ROW BEGIN INSERT INTO company_audit.customers (customer_id, col2, col3, col4, col5) VALUES (OLD.customer_id, OLD.col2, OLD.col3, OLD.col4, OLD.col5); END$$ DELIMITER ; 现在我的问题是:如何构造上面列表中的 SQL 字符串(使用存储过程),以便可以动态获取列名(例如,从information_schema )。 我在这里看到过类似的东西:http://uber-code.blogspot

2021-09-19 00:32:04    分类:技术分享    mysql   ddl   audit-trail

动态构建用于创建触发器的 MySQL 代码(Dynamically constructing MySQL Code for creating a trigger)

问题 我正在尝试为 MySQL 数据库实现审计跟踪/日志记录。 现在我创建了一个“审计”数据库(我们称之为company_audit ),它将包含主数据库中某些表的“审计”副本。 (例如,对于company.customers我将创建company_audit.customers 。审计表将包含与原始表中完全相同的列。 我想使用触发器将原始表中的更改插入到审计表中,如下所示: DELIMITER $$ DROP TRIGGER IF EXISTS customers_history_AU$$ CREATE TRIGGER customers_history_AU AFTER UPDATE ON customers FOR EACH ROW BEGIN INSERT INTO company_audit.customers (customer_id, col2, col3, col4, col5) VALUES (OLD.customer_id, OLD.col2, OLD.col3, OLD.col4, OLD.col5); END$$ DELIMITER ; 现在我的问题是:如何构造上面列表中的 SQL 字符串(使用存储过程),以便可以动态获取列名(例如,从information_schema )。 我在这里看到过类似的东西:http://uber-code.blogspot

2021-09-19 00:30:57    分类:技术分享    mysql   ddl   audit-trail

在特定列上设置 ANSI_PADDING(在同一表的不同列中 ANSI_PADDING ON 和 OFF)(Set ANSI_PADDING on a specific column (ANSI_PADDING ON and OFF in different columns of the same table))

问题 是否有可能 - 使用单个 CREATE TABLE 脚本 - 将特定的varbinary列设置为ANSI_PADDING = ON而其他设置为ANSI_PADDING = OFF ? 例如 CREATE TABLE PaddingX ( ... ColumnA varbinary(max), ... ColumnB varbinary(50) ) 我希望ColumnA修剪(填充OFF ),但ColumnB包含完整(填充)值 - padding ON 。 回答1 您必须分两步完成: SET ANSI_PADDING OFF -- create the table without the columns that need ANSI padding SET ANSI_PADDING ON -- alter the table to add the columns that need ANDI passing 这是唯一的方法。 如果您查看 SET ANSI_PADDING 文档的注释,您可以阅读: 此设置仅影响新列的定义。 创建列后,SQL Server 会根据创建列时的设置存储值。 现有列不受此设置稍后更改的影响。 注意:要添加新列,您可以查看 ALTER TABLE 文档的示例。 回答2 这似乎也适用于需要更改现有列的表: SET ANSI_PADDING ON GO

2021-09-18 17:27:59    分类:技术分享    sql   sql-server   ddl

如何在 PostgreSQL 中获取聚合的定义/源代码?(How to get definition/source code of an aggregate in PostgreSQL?)

问题 我发现这个相关的答案很有用: 从 PostgreSQL 导出“创建聚合”函数 但是如何在没有 GUI 客户端(例如使用 psql 命令行)的情况下获得CREATE AGGREGATE语句? 回答1 像这样的东西,但我不确定这是否涵盖了创建聚合的所有可能方式(它绝对不考虑引用标识符的需要) SELECT 'create aggregate '||n.nspname||'.'||p.proname||'('||format_type(a.aggtranstype, null)||') (sfunc = '||a.aggtransfn ||', stype = '||format_type(a.aggtranstype, null) ||case when op.oprname is null then '' else ', sortop = '||op.oprname end ||case when a.agginitval is null then '' else ', initcond = '||a.agginitval end ||')' as source FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid JOIN pg_aggregate a ON a.aggfnoid = p.oid LEFT

2021-09-17 15:13:58    分类:技术分享    sql   postgresql   aggregate-functions   psql   ddl

对 VARCHAR 修改强制截断?(Force Truncation on VARCHAR modification?)

问题 我想在几列上将 VARCHAR 上限设置为 255,以便我可以添加索引。 alter table striker modify contacts varchar(255) 当我尝试运行上述命令时,我得到 Error Code: 1265. Data truncated for column 'contacts' at row 331 38.969 sec 有没有办法强制截断列,以便此命令成功缩短 VARCHAR? 我不在乎缩短列中的数据。 回答1 您可以手动将列截断为 255 个字符: UPDATE striker SET contacts = SUBSTR (contacts, 1, 255); 现在,您知道没有值超过 255 个字符,您可以安全地执行 OP 中的alter table语句。 回答2 为什么要截断列? 只需为列创建带有长度说明符的索引。 下面是一个例子: create index idx_striker_contacts on striker(contacts(255)) 您可以对多列执行此操作。

2021-09-17 09:20:46    分类:技术分享    mysql   sql   ddl   alter-table

为什么截断 DDL 语句?(Why is truncate a DDL statement?)

问题 truncate 语句后表结构保持不变,只有记录被删除(自动提交)。 那么 truncate 是 DDL 语句的原因是什么? 回答1 我在这里添加一些解释:默认情况下,截断表时,您不仅仅是删除行,您还隐含地告诉 Oracle 数据库还执行以下任务: 释放已删除行使用的所有空间,但 MINEXTENTS 存储参数指定的空间除外 将 NEXT 存储参数设置为截断过程从段中删除的最后一个区的大小 因此,它通过重置水位高标来更改存储定义并更改表的结构。 它也不能是 DML,对吗? 不能指定 where 子句或随 DDL 语句一起出现。 如果 truncate 是 DML 语句,那么 Oracle 将允许我们将 truncate 与 where 子句一起使用。 注意:SQL 中的 WHERE 子句指定 SQL 数据操作语言 (DML) 语句应仅影响满足指定条件的行。 回答2 TRUNCATE重置表的高水位标记,有效地消除所有先前存在的行。 将其视为 DDL 语句可以使其速度超快,因为它可以在不保留撤消(回滚)信息(如 DML 语句)的情况下运行。 回答3 一个简单实用的解释可以是: 截断通过更改数据定义来重新初始化身份,因此它是DDL ,而 Delete 仅从表中删除记录,并且不会对其定义进行任何更改,这就是为什么它是DML 。 比如创建一个表名并插入一些初始记录。 删除所有记录(没有

2021-09-14 08:26:38    分类:技术分享    sql   oracle   ddl

使用 Jenkins 创建 Cassandra 数据库(create Cassandra database with Jenkins)

问题 有谁知道如何通过 Jenkins 运行 DDL 脚本来创建 Cassandra 数据库? 我正在尝试在测试环境中通过 Jenkins 连接到 Cassandra,以便上传测试基线数据集并针对它运行集成测试。 回答1 我创建了自己的解决方案来解决类似的问题。 不仅用于测试,还用于在架构随时间发生变化时按顺序应用脚本。 它将在 Jenkins 或任何地方工作。 有一个类可以按顺序遍历脚本列表,将每个脚本作为输入流打开。 然后该类调用该类的 execute() 方法: package org.makeyourcase.persistence; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Session; import com.datastax.driver.core.exceptions.SyntaxError; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org

2021-09-13 21:09:58    分类:技术分享    jenkins   cassandra   ddl

ORA 01400 和 ORA 02296:无法插入空值或将添加的列属性修改为 NOT NULL(ORA 01400 and ORA 02296 : Cannot insert null or modify added column properties to NOT NULL)

问题 “修改您的查询以添加一个从新工资中减去旧工资的列。标记该列增加。运行修改后的查询。” 好吧,根据我的解释,我首先尝试通过脚本添加列: ALTER TABLE EMPLOYEES ADD ( INCREASE2 NUMBER(6)); 然后: INSERT INTO EMPLOYEES(INCREASE2) SELECT (salary*1.155) - salary FROM EMPLOYEES; SQL 错误:ORA-01400:无法将 NULL 插入 ("HR"."EMPLOYEES"."EMPLOYEE_ID") 01400. 00000 - “无法将 NULL 插入 (%s)” "HR"."EMPLOYEES"."EMPLOYEE_ID"是主键。 我不是要插入 NULL 值; 我不知道为什么 oracle 不接受我的条目。 我尝试通过执行基本插入来检查表达式中是否存在任何语法错误: INSERT INTO EMPLOYEES(INCREASE2) VALUES ('whatever'); 我仍然收到错误。 我尝试然后将该列修改为不为空 ALTER TABLE EMPLOYEES MODIFY (INCREASE2 NUMBER(6) NOT NULL); 和: 02296 00000 - “无法启用 (%s.%s) - 发现空值” *原因:alter table

2021-09-13 05:45:14    分类:技术分享    oracle   ddl   notnull

使用多个 WHEN 条件触发(Trigger with multiple WHEN conditions)

问题 如何包含需要监控的列? 即不是一个WHEN条件我想有3 WHEN条件: CREATE TRIGGER freeradius.insert_into_day_summations BEFORE INSERT ON freeradius.day_guiding_usage FOR EACH ROW WHEN (OLD.col1 IS DISTINCT FROM NEW.col1) WHEN (OLD.col2 IS DISTINCT FROM NEW.col2) WHEN (OLD.col3 IS DISTINCT FROM NEW.col3) EXECUTE procedure update_sessioninfo(); 回答1 使用OR或AND形成单个表达式 - 取决于您是要在满足所有条件时还是在满足任一条件时触发: CREATE TRIGGER update_day_summations -- see below BEFORE UPDATE ON freeradius.day_guiding_usage FOR EACH ROW WHEN (OLD.col1 IS DISTINCT FROM NEW.col1 OR OLD.col2 IS DISTINCT FROM NEW.col2 OR OLD.col3 IS DISTINCT FROM NEW.col3)

2021-09-12 20:47:40    分类:技术分享    postgresql   triggers   ddl   boolean-expression