我正在寻找 SQL Server 和 Oracle 数据库的元数据规范(数据字典)。
通过元数据映射,我的意思是对构成数据库模型的对象及其关系的明确描述(即服务器具有 0:n 数据库,表具有 1:n 列,列具有 0:n 约束)。
这些 DBMS 平台的任何版本都是有用的。
我正在处理一个查询,以判断给定会话中哪些对象具有锁定,但我遇到了一些阻塞问题。
这是我的基本查询:
SELECT request_session_id AS session_id,
request_owner_id AS transaction_id,
OBJECT_SCHEMA_NAME(resource_associated_entity_id, resource_database_id),
OBJECT_NAME(resource_associated_entity_id, resource_database_id),
COUNT(1) AS lock_count
FROM sys.dm_tran_locks WITH (NOLOCK)
WHERE resource_type = 'OBJECT'
GROUP BY request_session_id, request_owner_id,
resource_database_id, resource_associated_entity_id
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,我偶尔会被实际持有锁的会话之一阻止。如果我删除OBJECT_NAME和OBJECT_SCHEMA_NAME然后我没有任何问题。我试过将信息转储到一个表中,然后在有类似问题的表中使用这些值的函数。
这让我相信问题出在OBJECT_NAME和OBJECT_SCHEMA_NAME函数中,但我不确定为什么或如何解决它。我也不确定为什么我有时会被阻止有时不会。有没有人有什么建议?
我在 SQL Server 2008 R2 机器上拥有系统管理员权限。我找到了一个脚本,它可以删除所有外键,并在测试导入后需要时为我们重新添加它们。因此,我执行以下代码时没有语法错误,因为它显示了“Alter Table [ParentTable] Drop Constraint FK_Name”...总共 23 个键,但是当我刷新服务器或数据库和表时,当我为每个表展开 Keys 节点时,我仍然看到它们吗?那么为什么不丢弃它们呢?另外,如果我想再次运行以进行测试,我是否需要将其转换为永久表或将脚本放入存储过程中?请指教。
我使用了“Pinal Dave”发布的“Swastik Mishra”中的以下脚本 http://blog.sqlauthority.com/2014/04/11/sql-server-drop-all-the-foreign-key-constraint-in- database-create-all-the-foreign-key-constraint-in-database/
SET NOCOUNT ON
DECLARE @table TABLE(
RowId INT PRIMARY KEY IDENTITY(1, 1),
ForeignKeyConstraintName NVARCHAR(200),
ForeignKeyConstraintTableSchema NVARCHAR(200),
ForeignKeyConstraintTableName NVARCHAR(200),
ForeignKeyConstraintColumnName NVARCHAR(200),
PrimaryKeyConstraintName NVARCHAR(200),
PrimaryKeyConstraintTableSchema NVARCHAR(200),
PrimaryKeyConstraintTableName NVARCHAR(200),
PrimaryKeyConstraintColumnName NVARCHAR(200)
)
INSERT INTO @table(ForeignKeyConstraintName, ForeignKeyConstraintTableSchema, ForeignKeyConstraintTableName, ForeignKeyConstraintColumnName)
SELECT
U.CONSTRAINT_NAME,
U.TABLE_SCHEMA,
U.TABLE_NAME,
U.COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE U
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C
ON U.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE
C.CONSTRAINT_TYPE = 'FOREIGN KEY'
UPDATE @table SET
PrimaryKeyConstraintName …Run Code Online (Sandbox Code Playgroud) foreign-key sql-server metadata sql-server-2008-r2 alter-table
我正在尝试构建一个系统,该系统将收集对许多(30 万+)个对象中的每一个的各种数量(10+)的估计,并根据这些估计的历史记录做出决策。例如,我们有许多人工和自动化流程可能试图确定一个对象的,例如 PowerLevel,并且当它们报告的结果可能(或可能不会)相互替代时,我们想跟踪历史这些报告以及来自流程的元数据(日期、调整参数、代码版本等)。具体来说,我们可能想要执行诸如“按实体 id 分组,对于每个不同的属性,查找最新估计”或“查找其属性具有由代码库 573ae4 运行的任何更新的所有实体”之类的查询。
作为从未在生产中实际使用实体属性值模式的人,这似乎是 EAV 之类的完美用例,为源提供额外的元数据列。具体来说,我会设想一个这样的表格:
entity_id | attribute_id | string_value | numeric_value | datetime_value | discovery_time | discovery_source | discovery_tuning_parameters | discovery_code_hash
但是我听到了很多对这些类型架构的批评,例如这个答案。我很难找到在非遗留系统上使用 EAV 的人,这让我非常犹豫,我可能会重新发明一个非常过时的轮子......
另一方面,我能想到的唯一其他选择是完整的 NoSQL (bleh) 或一些邪恶的混合体,例如:
id | power | power_current_discovery_date | power_current_discovery_source | power_history (an array of hstores?) | foobar | foobar_current_discovery_date | ...
因为我们需要每个属性的元数据。
有什么想法吗?这是 EAV 适合的少数几次之一吗?谢谢你的帮助!
给定一个表格...
create table dbo.FilterIDXTest (
id int not null identity primary key clustered,
_bigint bigint,
_varchar10 varchar(10),
_varchar20 varchar(20),
_guid uniqueidentifier
);
go
create unique index uq_FilterIDXTest
on dbo.FilterIDXTest ( _varchar10, _varchar20 )
include ( _guid )
where _bigint is not null
and id > 5;
go
Run Code Online (Sandbox Code Playgroud)
...在什么(如果有)目录视图(或其他格式良好的参考对象)中可以WHERE定位和严格识别子句中的列名称?
sys.indexes可以查看提醒我们的filter_definition是([_bigint] IS NOT NULL AND [id]>(5))。
sys.index_columns可以查看ON和INCLUDE列,但仅列出原始CREATE INDEX命令中的 5 列中的 3 列。filter_predicate此处未找到这些列。
我必须假设filter_predicate在某个阶段对依赖项进行了严格检查,因为sp_rename …
在 SQL Server 中,我们如何找到所有没有以下任一项的表:
如果我创建一个表和这样的分区......
CREATE TABLE tab1 (a int, b int) PARTITION BY RANGE(a);
CREATE TABLE tab1_p1 PARTITION OF tab1 FOR VALUES FROM (0) TO (100);
CREATE TABLE tab1_p2 PARTITION OF tab1 FOR VALUES FROM (100) TO (200);
Run Code Online (Sandbox Code Playgroud)
我如何随后检查范围?我试过浏览 information_schema.tables 和 information_schema.table_constraints 但到目前为止没有运气。
在您自己的表中使用 OBJECT_ID() 作为引用是否安全,并假设无论如何该值将始终引用同一个数据库对象?
在MSDN状态
所有元数据函数都是不确定的。这意味着这些函数在每次调用时并不总是返回相同的结果,即使输入值相同。
所以这表明它不安全,但我找不到任何(其他)确凿的事实不应该这样做,而且,公平地说,没有人们实际这样做的例子,这本身可能是不这样做的证据做吧。
但是 OBJECT_ID() 值(或似乎)在系统表和视图中用作从一个对象到另一个对象的键,因此必须具有某种形式的完整性和可靠性。
作为记录:我不一定需要它,但它只是在设计我的系统时作为一个选项突然出现在我的脑海中,并且很好奇。
我有一个表my_tables,它在几个表中被引用为外键。
我想选择my_table其他表中未引用的所有行。
AFAIK,应该可以以通用方式(带有一些内省魔法)来做到这一点。
PostgreSQL 有一个特殊的功能,称为COMMENT将元数据附加到标识符或任何类型(模式、表、列、函数、类型、域等)。看起来像这样,
COMMENT ON TABLE mytable IS 'This is my table.';
Run Code Online (Sandbox Code Playgroud)
评论有最大尺寸吗?
metadata ×10
sql-server ×5
foreign-key ×3
postgresql ×3
alter-table ×1
blocking ×1
comments ×1
dmv ×1
eav ×1
oracle ×1
partitioning ×1
schema ×1