数据库管理员

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

2
限时降低ORDER BY
我有这个查询: SELECT * FROM location WHERE to_tsvector('simple',unaccent2("city")) @@ to_tsquery('simple',unaccent2('wroclaw')) order by displaycount 我对此感到满意: "Sort (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)" " Sort Key: displaycount" " Sort Method: quicksort Memory: 206kB" " -> Bitmap Heap Scan on location (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)" " Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) …

5
更改架构后如何检测损坏的存储过程?
我已经在数据库中修改了一个中央表,并且sp_depends确实返回了数百个结果,而且我担心其中的一些存储过程在更改后可能无法再编译。 检查一个存储过程很容易(我只是重新运行alter脚本,然后查看操作是否成功),但是在100多个过程中执行此操作比较麻烦。 我知道我可以使用像这样的脚本来重新编译数据库中的所有对象,但是实际操作将在下一次执行存储过程时发生,而不是立即执行,因此对于我来说似乎不合适。 我还以为我可以完全删除所有存储过程,并使用源代码控制系统重新同步数据库,但是该选项虽然可行,但却不是一个很好的选择。有更好的方法吗? 我正在使用SQLServer 2008 R2,我的数据库脚本存储在VS 2008数据库项目中。 需要澄清的是,我并不是在主张应该完全依靠这种方法来测试代码。就像在C#中一样,您在编写代码时会立即检测其他依赖文件中的语法错误(然后使用其他策略进行测试,例如单元测试,通常速度要慢几个数量级),我认为检测SQL依赖关系很有意义错误只需几秒钟即可完成,而不必运行通常需要几个小时才能完成的完整功能测试。

1
了解块大小
我的问题针对Postgres,但从任何数据库背景来看,答案可能就足够好。 我的假设正确吗: 磁盘具有固定的块大小? RAID控制器可以具有不同的块大小吗?是否将一个RAID块拆分为多个实际磁盘块? 该文件系统还具有独立的块大小,该块大小又被拆分为RAID块大小吗? Postgres适用于固定的8k块。到文件系统块大小的映射在这里如何发生?文件系统是否将Postgres 8k块批处理在一起? 设置系统时,最好将所有块都设置为8k?还是设置不是很重要?我还想知道在崩溃时某些“错误”的块大小设置是否会危害数据完整性?也许Postgres 8k块必须拆分为多个磁盘块? 还是什么都没有批处理在一起,因此我在定义的块大小之间的每一个不匹配都会丢失磁盘空间?

3
将日期存储为整数(数字)有什么好处
问题1 我正在使用将日期存储为整数(实际数字(8,0))的系统,并且我注意到其他系统也在此线程中将日期存储为int,例如cisco。例 20120101 -- 01 Jan 2012 保留数字日期系统而不使用SQL Datetime有什么好处? 问题2 现在,我试图遍历数字日期以在两个日期之间找到客户。如果start和enddate包含两个月,我将获得数千条记录,而不仅仅是60条。示例: create table #temp1(day int,capacity int) /* just a temp table */ declare @start int declare @end int set @start=20111201 set @end = 20120131 while (@start <= @end) Begin insert into #temp1 /* I am storing things in #temp table …

2
如何在MySQL中对外键使用RESTRICT?
在数据库结构中 CREATE TABLE Country ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE City ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE Map ( country varchar(40) NOT NULL, city varchar(100) NOT NULL, PRIMARY KEY (country,city), FOREIGN KEY (country) REFERENCES …

2
查看Postgresql内存使用情况
我在Ubuntu服务器上运行Postgresql,需要能够监视其内存使用情况。目前,我有一个脚本在一分钟的cron作业中运行,以监视/记录各种统计信息,并且还需要监视/记录Postgresql的当前内存使用情况。我已经四处搜寻,但找不到很多东西,除了Postgresql善用共享内存,这样的程序(例如“ top”)给出的值并不准确。 如何在任何给定时间监视Postgresql的总内存使用量?以后将使用这些数据来创建图形进行分析。

3
在SQL中实现一对零或一个关系
让我们说,我正在为存在一对零或一个(1-0..1)关系的场景设计数据库。例如: 有一组用户,有些 用户也可能是客户。 因此,我创建了两个对应的表,users和customers,但是…… …在给定的SQL平台上表示和实现这种情况的最佳方法是什么?我考虑了两种可能的解决方案: 在users表中,添加customer可能是FOREIGN KEY引用customers或NULL标记的列。 在customers表格中,包括指向表格的user列(设置了UNIQUE约束)users。 我已经在一些论坛中提出过类似的问题,但是答案基本上是“无论您需要什么”,“无论您认为方便什么”。我不喜欢这种答案。我想要一个严肃的DB理论,一个有充分根据的答案。我在哪里可以阅读有关1-0..1关系的信息?

2
接收到“对对象的SELECT权限被拒绝”,即使已被授予
我是程序员,而不是dba。。。我知道足够危险了。 我继承了一个旧用户,该旧用户是该数据库的db_owner。出于业务原因,我们无法调整该用户对现有表,模式等的权限,但是正在创建一些新表,我只希望该用户对其具有SELECT访问权限。 已为这些用户设置了这些表的权限,以便除SELECT(设置为GRANT)以外的所有内容都被拒绝。 但是,当此用户(dbadmin)尝试对这些表之一(AccountingAudit)执行SELECT时,会发生此错误: The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. 我已经运行此SQL来尝试查看为此表/用户设置了哪些权限: select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) as grantor, permission_name, state_desc from sys.database_permissions 这就是我得到的: AccountingAudit dbadmin dbo ALTER DENY AccountingAudit dbadmin dbo CONTROL DENY AccountingAudit dbadmin dbo DELETE DENY AccountingAudit dbadmin …

1
重新启动MySQL复制从站
自设置以来,我第一次需要重新启动只读的MySQL复制从站。 我发现了这篇关于关闭从属服务器进行维护的文章(尽管他只是在描述停止mysql守护程序): 如何安全地重启您的MySQL从服务器 概括而言,该过程是: 在mysql客户中: STOP SLAVE; FLUSH TABLES; 从操作系统: /etc/init.d/mysql stop 我会在这时重启,然后在系统启动后: 在mysql客户端中(mysql守护程序配置为在启动时启动): START SLAVE; 这看起来正确吗?我还有什么需要做的吗?

2
MySQL中触发器与存储过程的性能
关于DBA.StackExchange(触发器在记录上保留修订号的最佳实践是什么?)的一篇文章引发了一个关于MySQL性能的有趣的问题(至少对我来说很有趣)。 上下文是我们要在表中为每个更新的行插入一条记录。在更新该行之前,我们要存储一个先前的值,然后递增其中一列(“版本”列)。 如果我们在触发器中执行此操作,则效果很好。对于MySQL,触发器是逐行的,因此这是一个简单的解决方案。选择表中当前的数据,将其插入日志记录表,然后更新新数据中的“版本”列。 但是,可以将此逻辑移至存储过程。如果这样做,您将执行插入操作,然后增加表中的“版本”列。整个事情将基于设置。 因此,在执行此插入操作时,使用基于集合的存储过程方法或基于触发器的方法会更有效吗? 这个问题是针对MySQL的(因为它具有逐行触发器),尽管它可以应用于其他逐行触发器DBMS。

3
为什么.bak比要备份的数据库小得多?
我只是备份了SQL Server数据库。MDF和LDF文件总共约29 GB,但是.bak文件只有23 GB,约小20%。 我的第一个猜测是,数据压缩的一个版本小于包含相同数据的另一个版本时,将是数据压缩,但是压缩通常会产生比20%更好的压缩率,尤其是对于高序数据(例如数据库表)而言。 )而且,压缩后的数据不能轻易地进一步压缩,但是我知道.bak文件可以被压缩。 因此,如果数据没有被压缩,并且没有任何东西被丢弃,(因为进行备份的全部目的是以后能够将其恢复到相同的状态),那么那20%的原因是什么呢?

1
Oracle SQL Developer中的查询执行时间
我知道我可以set timing on用来查看执行完成后执行查询所花的时间。 但是,当查询仍在运行时,是否可以在Oracle SQL Developer中查看当前的执行持续时间? SQL Server Management Studio和旧的查询分析器都具有以下功能:
11 oracle  tools 

3
SQL Server:仅用于系统表的文件组?
我们的公司标准之一是为用户表/索引提供单独的文件组/文件。这被设置为默认值,因此不需要限定CREATE TABLE语句。 所以看起来像这样 fileid 1 =系统表,MDF fileid 2 = t-log = LDF fileid 3 =用户资料= NDF 在座的任何人都可以帮助我理解为什么要这样做的原始理由吗? 我会干净的说我是伏都教徒。上午我错了......? 编辑:我知道如何使用文件组来分离索引/分区/档案,以及如何恢复零碎的文件。这个问题是关于在同一卷上仅对系统表使用单独的文件组。

2
防止SSMS查看服务器的文件系统
我有几个用户在我的管理下共享MS SQL Server 2017。他们不应该看到(甚至不知道)该服务器上的其他用户及其数据。每个用户都有自己的数据库。他们可以使用他们的数据库做任何想要的事情。 我正在使用SQL Server的Partial Containment功能将用户锁定在适当的位置。登录名是在数据库内部创建的。这样效果很好,因为他们看不到其他用户帐户或数据库。将数据库登录名添加到我使用以下命令创建的数据库角色中: USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole 我刚刚创建了一个数据库登录帐户,仅将其添加到上述角色。用户没有其他权限(据我所知)。 剩下的唯一问题是SSMS仍然能够浏览服务器的文件系统。如果我右键单击数据库并选择Tasks -> Restore -> Database,然后选择Device: -> [...]并添加文件。这使SSMS可以浏览服务器的文件系统,我想否认这一点。用户实际上不能还原数据库,但可以浏览文件系统。 这里的问题表明SSMS正在使用存储过程xp_fixeddrives,xp_dirtree并且xp_fileexist。但是,这些存储过程在具有所述组许可的用户身份执行时返回空结果。我已经读到,这是用户不是sysadmin角色成员时的行为。这已经使我有些困惑,因为我明确拒绝了执行该命令,但是用户仍然可以执行存储过程。但是,当通过SSMS浏览文件系统时,它不是空的。 SSMS从哪里获取文件系统信息,如何防止这种情况发生? 编辑:我也刚刚注意到,SSMS能够检索所有数据库在服务器上存在的所有数据库备份的列表。再说一次,我不知道它如何获得这些信息以及如何防止它。


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.