数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
在PostgreSQL中查询JSONB
我有一个表,persons其中包含两列,一个id和一个基于JSONB的data列(此表仅出于演示目的而制作,可以与PostgreSQL的JSON支持一起使用)。 现在,假设它包含两个记录: 1, { name: 'John', age: 30 } 2, { name: 'Jane', age: 20 } 现在,假设我想获得每个25岁以上的人的名字。我尝试过的是: select data->'name' as name from persons where data->'age' > 25 不幸的是,这会导致错误。我可以使用->>代替来解决它->,但是比较不会再按预期进行,因为不是比较数字,而是将它们表示为字符串: select data->'name' as name from persons where data->>'age' > '25' 然后,我发现实际上可以使用->和强制转换为解决此问题int: select data->'name' as name from persons where cast(data->'age' as int) > …

2
如果存在,则更新,否则插入
我正在尝试创建一个STORED PROCEDURE将用于UPDATE名为的表的machine。此表有三列(machine_id,machine_name和reg_id)。 在上述表中,reg_id(INT)是一列,其值可以更改为machine_id。 我想定义一个QUERY/ PROCEDURE来检查reg_id该表中是否已经存在。如果是这样,则UPDATE该行,否则INSERT为新行。 一个人可以帮我写QUERY/ PROCEDURE?
14 mysql 

2
查找哪个会话持有哪个临时表
我们有一个SQL Server 2005数据库,临时数据库已满。通过进入SQL Server Management Studio,我可以看到tempdb中的所有临时表。是否可以判断哪个会话正在保存哪个临时表?理想情况下,该查询将列出每个会话使用的临时表。 谢谢,

5
截断表需要什么权限?
我有一个对数据库具有以下权限的SQL帐户: db_executor您看到此帐户是该帐户成员的角色是通过以下脚本创建的: CREATE ROLE [db_executor] AUTHORIZATION [dbo] GO GRANT EXECUTE TO [db_executor] GO 当我运行一个select,update,insert或delete放在桌子上,它工作正常。当我尝试到truncate表时,它给了我这个错误信息: 无法找到对象“ TableName”,因为该对象不存在或您没有权限。 该帐户缺少什么权限?

2
复合主键是一个坏习惯吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 我想知道复合主键是否是一种不好的做法,如果不是,则建议在哪种情况下使用。 我的问题是基于这篇文章 关于复合主键的部分: 错误做法6:复合主键 这是一个有争议的观点,因为当今许多数据库设计人员都在谈论使用整数ID自动生成的字段作为主键,而不是使用由两个或多个字段的组合定义的复合键。目前,这被定义为“最佳实践”,就我个人而言,我倾向于对此表示赞同。 但是,这只是一个约定,当然,DBE允许定义复合主键,许多设计人员认为这是不可避免的。因此,与冗余一样,复合主键是设计决策。 但是请注意,如果带有复合主键的表预期有数百万行,则控制复合键的索引可能会增长到CRUD操作性能大大下降的地步。在那种情况下,最好使用一个简单的整数ID主键,其索引将足够紧凑,并建立必要的DBE约束以保持唯一性。



1
查找对特定列的依赖关系(现代方式,不使用sysdepends)
我需要查找所有不仅消耗特定表,而且消耗表中特定列的视图和存储过程。 以下“似乎”可以正常工作,但是使用此方法时要注意许多警告(由于各种原因不可靠,即将被弃用,等等): SELECT object_name(so.id) TableName, sc.name ColumnName, OBJECT_NAME(sd.id) DependentObjectName, (SELECT xtype FROM sysobjects so WHERE so.id = sd.id) Object_Type FROM sysobjects so INNER JOIN syscolumns sc ON so.id = sc.id INNER JOIN sysdepends sd ON so.id = sd.depid and sc.colid = sd.depnumber WHERE object_name(so.id) = 'MyTableName' AND sc.name = 'MyColumnName' …
14 sql-server 


1
Postgres:关系不存在错误
我用pg_restore用转储文件加载了我的postgres数据库。我用用户连接到数据库: sudo -u arajguru psql dump select current_user; current_user -------------- arajguru 现在,我可以看到所有新创建的表: dump=> \dt List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | Approvals | table | arajguru public | Approvers | table | arajguru public | Conditions | table | arajguru public | Entities | …
14 postgresql 

4
删除Postgres数据库中的所有数据
我已经使用--data-only和--column-inserts标志从生产服务器上创建了一个新的数据库转储,因此在暂存服务器上执行还原时,我只有一堆插入语句可插入数据。 pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql 从生产转储中还原数据之前,如何先删除登台服务器数据库中的所有数据? 我只想删除所有数据,所以不必删除和创建数据库以及所有其他东西。我只想删除数据并插入所有新数据。 由于多种原因,我没有选择删除和​​创建数据库的选项。我将必须删除所有数据并仅插入,因此无论如何查找该方法,我都愿意这样做,但是显然需要帮助。 我还需要自动执行此过程。将自动执行“从生产数据库中转储数据”,然后“在暂存数据库上删除数据”,然后“将数据还原到暂存数据库”。我只需要“在登台数据库上删除数据”部分的帮助。 我在PostgreSQL 9.5.2上运行

2
PostgreSQL UPSERT问题与NULL值
我在使用Postgres 9.5中的新UPSERT功能时遇到问题 我有一个表,用于汇总来自另一个表的数据。复合键由20列组成,其中10列可以为空。下面,我为我遇到的问题创建了一个较小的版本,尤其是NULL值。 CREATE TABLE public.test_upsert ( upsert_id serial, name character varying(32) NOT NULL, status integer NOT NULL, test_field text, identifier character varying(255), count integer, CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id), CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field) ); 根据需要运行此查询(首先插入,然后随后的插入仅增加计数): INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) VALUES ('shaun',1,'test value','ident', 1) ON CONFLICT …

3
如何最好地维护SQL日志文件大小
我有点像是新的DBA,并且正在管理一个活动量很大的SQL Server 2012实例。我正在完全恢复模式下运行,因为我们需要时间点恢复。 现在,我每天凌晨5点对数据库和日志进行完整备份。一些日志文件已膨胀到300GB,即使备份后它们也不会减小大小。我可以通过运行类似于以下内容来减小它们的尺寸: BACKUP LOG db1 TO DISK = '\\server\share\db1_log1.trn'; DBCC ShrinkFile([db1_log], 0); BACKUP LOG db1 TO DISK = '\\server\share\db1_log2.trn'; DBCC ShrinkFile([db1_log], 0); BACKUP LOG db1 TO DISK = '\\server\share\db1_log3.trn'; DBCC ShrinkFile([db1_log], 0); 当我检查备份文件的LSN时,会看到类似以下内容的内容: RESTORE headeronly FROM DISK = N'\\server\share\db1_log1.trn' FirstLSN: 15781000014686200001 SecondLSN: 15802000000665000001 RESTORE headeronly FROM DISK = …


1
部分覆盖范围谓词的垂直度估计
目前,我正在尝试弄清楚SQL Server如何评估部分覆盖直方图步骤的范围谓词的基数。 在Internet上,在针对阶跃统计值和阶跃内统计值进行基数估计时,我遇到了一个类似的问题,保罗·怀特(Paul White)给出了一个相当有趣的答案。 根据Paul的回答,用于估计谓词> =和>的基数的公式(在这种情况下,我只对至少120的基数估计器模型感兴趣): 对于>: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1))) 对于> =: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1)) 我根据使用TransactionDate列的范围谓词以及“ 20140614”和“ 20140618”之间的日期时间范围,在AdventureWorks2014数据库的[Production]。[TransactionHistory]表上测试了这些公式的应用。 此范围的直方图步骤的统计信息如下: 根据公式,我计算出以下查询的基数: SELECT COUNT(1) FROM [AdventureWorks2014].[Production].[TransactionHistory] WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000' …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.