我想使用 2 个查询,一个列出具有以下信息的给定表的所有外键,Schema name, foreign table name另一个列出所有主键。
这个列出主键的查询是否正确:
select syssc.name as schemaname , cast(c.name as varchar(255)) as foreign_table ,
cast(p.name as varchar(255)) as primary_table
from sysobjects f
inner join sysobjects c on f.parent_obj = c.id
inner join sysreferences r on f.id = r.constid
inner join sysobjects p on r.rkeyid = p.id
inner join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid
inner join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid
left join syscolumns …Run Code Online (Sandbox Code Playgroud) sql-server-2008 foreign-key database-design sql-server metadata
在新项目的数据库中,我已经开始约定让每个表都有一个最后修改的时间戳列。为了实现这一点,我为每个表编写了一个触发器:
CREATE TRIGGER touch_users
BEFORE UPDATE
ON users
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
CREATE TRIGGER touch_company
BEFORE UPDATE
ON company
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
-- etc for each table
Run Code Online (Sandbox Code Playgroud)
这很快就会变得乏味;特别是因为它们完全相同,除了表名。
有没有办法可以减少每个表所需的样板文件?或者甚至可能通过一个默认作用于每个表的触发器完全消除它?
我有三个大表(每个表约 20 列),我想知道每列有多少行的值。
比如这张表:
ID | TITLE | SERVING | NOTE
-------------------------------------------------------------------
6716 | Yummy Molasses ... | 1 cookie |
3765 | Rosemary-Red Wi... | |
5178 | Stuffed Avocado... | |
6025 | Amazing Pea Sou... | about 1 cup |
4412 | Overnight Oatme... | 1 cup | Note: Steel-cut oats...
Run Code Online (Sandbox Code Playgroud)
可能会产生与此类似的结果:
ID | TITLE | SERVING | NOTE
-------------------------------------------------------------------
100% | 100% | 60% | 20%
Run Code Online (Sandbox Code Playgroud)
这是一份内部报告,所以格式不是很重要。如果我只有count()百分比而不是百分比,那很好。有列名会很好,但不是必需的。等等。
我不太熟悉涉及更多元问题的查询,例如收集表名或处理表中的所有列,所以我很想看看人们的建议。
我有一个由其他视图(View-B View-C)组成的视图A,我想列出View-A使用的所有表(其中包括View-B和View-C中使用的表)。当我使用此代码时...
-- Get base tables for 'View-A' in Database-A
USE Database-A
GO
SELECT view_name, Table_Name
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE View_Name = 'View-A'
ORDER BY view_name, table_name
GO
Run Code Online (Sandbox Code Playgroud)
...我只得到了 View-A 立即使用的表以及其他视图的名称(View-B、View-C)。有没有办法递归获取 View-B 和 View-C 也使用的表的名称?
我正在阅读这篇文章:存储引擎内部:页面剖析。
我有一个数据库MyDB,数据库中有一个表MyTable。
我有以下问题:
如果我这样做:
(1) 使用以下查询查找表的对象 ID:
Use MyDB;
select sys.objects.name, sys.objects.object_id from sys.objects where (name = 'MyTable');
Run Code Online (Sandbox Code Playgroud)
(2) 然后使用以下命令查找分配给的所有页面MyTable:
dbcc ind(MyDB, 'MyTable', -1);
Run Code Online (Sandbox Code Playgroud)
(3)然后在结果表中,我选择其中一个数据页(页类型= 1),并使用以下命令:
DBCC TRACEON(3604);
DBCC PAGE (MyDB, 1, 17386, 3);
Run Code Online (Sandbox Code Playgroud)
那么在步骤(3)的转储内容(页头)中, m_objId(AllocUnitId.idObj)字段应该等于步骤(1)中获得的对象ID。那是对的吗?
以及这是否适用于用户表和系统基表,例如sys.syscolpars基表?
根据我的测试,以上两个结论都是正确的。
元数据:ObjectId 是什么意思?在文章中, 'metadata: objectId' <> m_objId。但是从我自己的测试来看,'metadata: objectId' 总是等于m_objId. 为什么?原始文章没有清楚地解释元数据。
我使用的是 SQL Server 2005、2008、2008 R2、2012 和 2014
我想检索在运行命令的过去一小时内修改的所有记录。它纯粹是一个元数据命令(不考虑任何表格列数据的内容)。我想识别在指定的时间持续时间内进行了一些 DML 修改的表和这些表的行。
在运行命令返回我要查找的信息之前,Postgres 是否需要特殊配置来跟踪如此详细的元数据?
我将运行什么查询来获取我正在寻找的结果?
Microsoft SQL Server 有一个名为sp_refreshview的系统存储过程,它更新传入的视图的元数据。
对我的所有视图定期运行此过程是否有任何不利之处?(例如性能统计受到影响等?)
我可以每晚、每小时、每隔几分钟运行一次吗?
如果这样做没有任何影响,这似乎是确保我的视图元数据在它们引用的基础实体可能发生更改时保持最新的好方法。
假设我从以下查询中得到一个结果集:
select *
from sys.database_files;
Run Code Online (Sandbox Code Playgroud)
对于任何给定的结果集,我希望能够查询列名和类型,以便我可以创建表来存储结果。
在 T-SQL 中执行此操作的好方法是什么?
我想知道是否有一种既定的方法来测试两个 PostgreSQL 表/关系是否具有相同的结构。换句话说,如何测试它们是否彼此兼容,因为我可以对它们执行诸如UNION ALL和 之类的集合操作?EXCEPT
我在 DBA.SE 和其他地方搜索,只能找到有关查找两个表的内容是否不同的问题(例如,检查两个表在 PostgreSQL 中是否具有相同的内容),或者当兼容性已知时(例如,比较两个表)具有相同的结构,但成员数量不同)。但我有兴趣检查表结构的兼容性。
我使用的是 PostgreSQL 10.3,但符合标准的方式当然更好。
有什么方法可以找到 PostgreSQL 12-13 中索引上次创建或重新索引的时间吗?
该文档显示了一些标准视图,例如pg_stat_user_indexes跟踪索引的使用统计信息,但我找不到任何跟踪创建/更新统计信息的内容。
metadata ×10
sql-server ×5
postgresql ×4
t-sql ×2
audit ×1
foreign-key ×1
index ×1
mysql ×1
trigger ×1
union ×1
update ×1