我正在数据库中寻找一条我不了解的精确信息。数据库在一台单独的机器上,但我可以登录它,并psql以管理员权限启动命令行。
这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库里面,所以我想做一点逆向工程。
给定一个表名,是否可以获得该表中列名的列表?
例如,在 SQL Server 中,可以将表转储到可重用CREATE语句中,该语句以文本方式列出了该表所包含的所有列。
我想在数据库中存在的列的名称中搜索字符串。
我正在处理一个维护项目,我处理的一些数据库有 150 多个表,所以我正在寻找一种快速的方法来做到这一点。
你有什么建议吗?
使用某些方法,当您创建表的副本时,您会丢失索引、PK、FK 等。例如在 SQL Server 中,我可以说:
select * into dbo.table2 from dbo.table1;
Run Code Online (Sandbox Code Playgroud)
这只是表格的简单副本;缺少所有索引/约束。如何复制表结构(不使用备份)?
我主要希望手动执行此操作,但如果不可能,我将接受任何解决方案。
如何获取数据库中所有分区表的列表?
我应该查看哪些系统表/DMV?
除非我将其关闭并重新启动,否则 SSMS 中的 IntelliSense 不会更新。我尝试在 SSMS 会话处于活动状态时断开与服务器的连接并重新连接,但这不起作用。
重建步骤:
如何在不重新启动 SSMS 的情况下强制 IntelliSense 更新?
我继承了一个包含数百个列的大型 (SQLServer) 数据库,这些列代表一件事或另一件事的数量。这些值的单位(例如“加仑”、“英寸”等)存储在扩展属性的 MS_Description 字段中。我想知道是否有更好的方法来存储这些信息。我认为用于文档目的很好,但很难根据这些数据进行可靠的单位换算计算。在这一点上,我不准备进行侵入性更改,但如果我有机会这样做,在这方面推荐的最佳实践是什么?在我的脑海中,选项可能包括:
更新:阅读@Todd Everett 的回答后,我想到了一个可能的解决方案,所以我将继续回答我自己的问题。(见下文)
我试图UNPIVOT在sys.databases2005 年到 2012 年的各种版本的 SQL Server 中包含的各种列上运行。
在UNPIVOT与以下错误消息失败:
Msg 8167, Level 16, State 1, Line 48
“CompatibilityLevel”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。
T-SQL:
DECLARE @dbname SYSNAME;
SET @dbname = DB_NAME();
SELECT [Database] = unpvt.DatabaseName
, [Configuration Item] = unpvt.OptionName
, [Configuration Value] = unpvt.OptionValue
FROM (
SELECT
DatabaseName = name
, RecoveryModel = CONVERT(VARCHAR(50), d.recovery_model_desc)
, CompatibilityLevel = CONVERT(VARCHAR(50), CASE d.[compatibility_level] WHEN 70 THEN 'SQL Server 7' WHEN 80 THEN 'SQL Server 2000' WHEN 90 THEN 'SQL …Run Code Online (Sandbox Code Playgroud) 我想要一种方法来确定给定数据库中的哪些列通过 PK/FK 关系连接。我可以通过以下方式返回给定表的 PK/FK 信息
SELECT *
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS cu
WHERE EXISTS (
SELECT tc.*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
WHERE tc.CONSTRAINT_CATALOG = 'MyDatabase'
AND tc.TABLE_NAME = 'MyTable'
/*AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'*/
AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME);
GO
Run Code Online (Sandbox Code Playgroud)
但是对于从这样的查询返回的 PK,我如何建立关联的 FK(假设有一个)?
我知道您还可以通过以下方式获取引用的表:
SELECT CONSTRAINT_NAME = name,
FOREIGN_SCHEMA = OBJECT_SCHEMA_NAME(parent_object_id),
FOREIGN_TABLE = OBJECT_NAME(parent_object_id),
REFERENCED_SCHEMA = OBJECT_SCHEMA_NAME(referenced_object_id),
REFERENCED_TABLE = OBJECT_NAME(referenced_object_id)
FROM sys.foreign_keys
WHERE OBJECT_NAME(referenced_object_id) = 'MyTable';
GO
Run Code Online (Sandbox Code Playgroud)
但我现在正在努力获得明确的列引用。
我正在为 QlikView 创建一个脚本生成器。要生成脚本,我需要约束和关联的链接。我需要任何给定列(如果有)的所有约束信息。
我想构建一个数据库类来保存给定数据库的所有信息。database.table.column.constraints然后将使用该类结构来获取 PK/FK 上不同列之间的匹配。
很明显,有些列只有 FK,在这种情况下,我还想检索相应键的 PK 信息;有些将只有PK,然后我想要相反的。有些当然可以两者兼而有之。
如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 D 的当前位置。我将使用以下方法:
新的顺序是 A、B、C 和 D。
我认为这是一种合法的做法,因为(到目前为止)它没有产生任何问题。
但是,今天我遇到了一个问题,当一个函数在同一张表上执行语句时返回以下错误:
table row type and query-specified row type do not match
以及以下细节:
Query provides a value for a dropped column at ordinal position 13
我尝试重新启动 PostgreSQL,VACUUM FULL按照此处和此处的建议执行并最终删除并重新创建该函数,但这些解决方案不起作用(除了他们尝试解决系统表已被更改的情况之外)。
有幸使用一个非常小的数据库,我导出了它,删除了它,然后重新导入它并解决了我的功能问题。
我意识到这样一个事实,即不应通过修改系统表(弄脏pg_attribute等)来弄乱列的自然顺序,如下所示:
从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …
postgresql metadata database-internals functions postgresql-9.6
我有一个包含大约 100 个表的数据库,我需要构建一个连接查询以从其中两个表中获取特定数据。我知道一个,但不知道另一个。基本上我需要这样的东西:
select <tables> from <database> where exists table.column name;
我怎样才能做到这一点?
metadata ×10
sql-server ×7
postgresql ×2
catalogs ×1
collation ×1
constraint ×1
foreign-key ×1
functions ×1
index ×1
intellisense ×1
partitioning ×1
schema ×1
ssms ×1