Sql-Server

在 SQL Server Express 2008 中未正確刪除表

  • May 8, 2020

我已經刪除了一個表,但它仍然列在 sys.tables 中。更令人困惑的是,我可以以一個使用者的身份再次創建表,但如果我以另一個具有相同權限的使用者身份登錄,我就不能(我收到表已存在的消息)。我需要作為第二個使用者重新創建表。

我已經設法以 sa 使用者身份登錄並執行 DBCC checkdb,但它沒有採取任何措施來解決問題。如何永久刪除 sys.tables 中的記錄(我假設這是問題的原因)。

無論是否使用dbo,始終明確指定模式前綴。否則,如果您的使用者具有不同的預設架構,您最終可能會在一個您沒想到的架構中得到對象。一個使用者在一個模式中創建了一個表,而另一個使用者看不到它。這是一個簡單的例子:

CREATE SCHEMA floob AUTHORIZATION dbo;
GO

CREATE USER blat1 
 WITHOUT LOGIN WITH DEFAULT_SCHEMA = floob;

CREATE USER blat2 
 WITHOUT LOGIN WITH DEFAULT_SCHEMA = dbo;

GRANT CREATE TABLE TO blat1, blat2;
GRANT ALTER ON SCHEMA::floob TO blat1, blat2;
GRANT ALTER ON SCHEMA::dbo TO blat1, blat2;

EXECUTE AS USER = 'blat1';
GO
CREATE TABLE Employees(ID INT);
GO
REVERT;

SELECT s.name, t.name
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE t.name = N'Employees';

EXECUTE AS USER = 'blat2';
GO
CREATE TABLE Employees(ID INT);
GO
REVERT;

SELECT s.name, t.name
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE t.name = N'Employees';

結果:

-----  ---------
floob  Employees

-----  ---------
dbo    Employees
floob  Employees

您應該檢查用於刪除表的使用者的預設架構。現有的表應該在另一個模式中,而要刪除的表在使用者的預設模式中。

引用自:https://dba.stackexchange.com/questions/53554