在 Sql Server 中使用“Sys”为系统或通用表名添加前缀是不是正常?

Posted

技术标签:

【中文标题】在 Sql Server 中使用“Sys”为系统或通用表名添加前缀是不是正常?【英文标题】:Does prefixing system or general table names with "Sys" fine in Sql Server?在 Sql Server 中使用“Sys”为系统或通用表名添加前缀是否正常? 【发布时间】:2022-01-08 01:18:30 【问题描述】:

在 Sql Server 中有 sys Schema。 sys.Columnssys.Tables。 我有一个通用表,我需要将其重命名为 SysUsers、SysRoles 等。

这样做可以吗?我不会使用 Sys 模式。我只会在表前加上 Sys 我发现 SQL Server 本身通常会这样做

select * FROM SysColumns      // NOTE its not sys.Columns

编辑:

正如下面提到的答案。有一个为 SQL Server 本身保留的 sysTables 列表。这就是为什么我不会使用 sys 作为前缀。

【问题讨论】:

在用户数据库中创建名为“sys...”的表没有问题。 允许吗?是的。令人困惑?是的。好主意?不。基于意见?是的。你决定。 如果你能预测出混淆的可能性,那可能是一个糟糕的选择。这些似乎是系统表,而不是 DBMS 系统表。为什么不使用更明确的命名约定避免潜在的混淆? 【参考方案1】:

TL;DR:不要这样做。

您将遇到名称冲突,您的对象将无法使用。


强烈建议不要这样做。如果您有任何名称冲突的对象,您将无法引用它。

举个简单的例子:

USE master;
GO

CREATE DATABASE Sillytest;
GO

USE Sillytest;
GO

SELECT *
FROM syscolumns; 
GO

SELECT *
FROM dbo.syscolumns; 
GO
SELECT *
FROM sys.syscolumns; 

GO

CREATE TABLE dbo.syscolumns (ID int, ColumnName sysname);
GO

SELECT *
FROM syscolumns; 
GO

SELECT *
FROM dbo.syscolumns; 
GO
SELECT *
FROM sys.syscolumns; 
GO

USE master;
GO

DROP DATABASE Sillytest;
GO

每个对syscolumns 的引用,无论是前缀dbosys,还是根本不引用,都引用了对象sys.syscolumns。这些语句中没有一条从我创建的(空)用户表dbo.syscolumns 返回数据。另请注意,在创建具有该名称的表之前对 dbo.syscolumns 的引用也有效。

是的,您可以创建对象,但如果名称已经作为 sys.sysobject 对象存在,那么您将无法使用它。

除此之外,已经有一个对象sys.sysusers,所以我们实际上已经有了答案;别这样,你们已经有冲突了。

【讨论】:

【参考方案2】:

完全同意@Larnu,我赞成这个答案。让我再添加一个。

通过在所有表名的前面放置一个前缀,实际上会损害您搜索、排序和过滤表的能力。它会减慢数据库的速度。它将损害 SSMS 行为和 3rd 方工具。

不要这样做,但也不要用其他东西这样做; tbl,tab,没有那些垃圾。

【讨论】:

以上是关于在 Sql Server 中使用“Sys”为系统或通用表名添加前缀是不是正常?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server在系统表sys.sysschobjs上创建索引[关闭]

SQL Server 文件操作

SQL Server 文件操作

SQL Server移除事务日志后sys.master_files依然存在记录问题

SQL Server:我应该在 sys 表上使用 information_schema 表吗?

SQL Server中sys.syslogin中updatedate字段的浅析