在 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.Columns
,sys.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
的引用,无论是前缀dbo
、sys
,还是根本不引用,都引用了对象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移除事务日志后sys.master_files依然存在记录问题