Tên bảng SQL Server bắt đầu bằng # trong cơ sở dữ liệu người dùng, không phải trong tempdb, không phải bảng tạm thời


13

Bằng cách nào đó, nhiều thập kỷ trước, một bảng đã được tạo trong cơ sở dữ liệu của chúng tôi bắt đầu bằng một #. Nó hiển thị trong Object Explorer trong cơ sở dữ liệu của ứng dụng, không phải trong tempdb. Vì một số lý do, Azure sẽ không nhập cơ sở dữ liệu như thế này.

Chúng tôi không thể bỏ nó, đổi tên nó hoặc tương tác với nó. Tôi đã thử xóa khỏi Object Explorer, Script Drop , Đổi tên từ GUI và không ai trong số họ đã làm việc.

Chúng tôi đang dùng SQL 2008 R2.

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could be found in the current database '*app*', given that @itemtype was input as '(null)'.

Làm thế nào để chúng ta tiêu diệt đối tượng này để chúng ta có thể di chuyển nó sang Azure?


4
Hãy thử đặt dấu ngoặc quanh tên bảng, cùng một phản ứng?
rvsc48

1
Bạn có thể thử sử dụng chức năng QUOTENAME nếu giải pháp của @ rvsc48 không thực hiện được (mặc dù tôi nghĩ nó sẽ như vậy). docs.microsoft.com/en-us/sql/t-sql/fifts/,
MguerraTorres

1
Chân đế: phản ứng tương tự.
đó là anh chàng

1
Vui lòng chạy truy vấn sau trong DB chứa bảng này và dán đầu ra vào câu hỏi : SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. Cảm ơn.
Solomon Rutzky

2
Một tùy chọn khác (mà tôi không có thời gian để kiểm tra): 1) Lấy object_idbảng đó. 2) Khởi động lại phiên bản trong chế độ người dùng đơn. 3) kết nối thông qua Kết nối quản trị chuyên dụng. 4) Trong DB đó, hãy thử một cái gì đó như UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}. Đáng giá một cú sút ..
Solomon Rutzky

Câu trả lời:


16

Được:

  1. sp_rename sử dụng tên đối tượng thay vì ID đối tượng,
  2. chúng ta không thể sử dụng tên đối tượng vì nó bắt đầu bằng a #và được hiểu là có ý nghĩa đặc biệt và được xử lý khác nhau,
  3. tất cả các lựa chọn khác đã hết

Bạn nên thử trực tiếp chỉnh sửa bảng danh mục hệ thống cơ bản thông qua kết nối Bảng điều khiển dành cho quản trị viên chuyên dụng (DAC) :

  1. Lấy object_idcái bàn đó.
  2. Khởi động lại thể hiện trong chế độ Người dùng đơn. Điều này là để có thể cập nhật trực tiếp các bảng hệ thống (nghĩa là không yêu cầu sử dụng kết nối DAC).
  3. Kết nối thông qua kết nối Bảng điều khiển dành riêng cho quản trị viên. Bạn có thể thực hiện việc này trong phiên tương tác SQLCMD bằng cách chạy phần sau trong cửa sổ Dấu nhắc Lệnh:

    C:\> SQLCMD -A -E

    hoặc, kết nối trực tiếp với DB bằng cách sử dụng:

    C:\> SQLCMD -A -E -d {database_name}
  4. Trong DB đó, hãy thử một cái gì đó như sau:

    UPDATE sys.objects$ {enter}
    SET [name] = N'obsolete' {enter}
    WHERE [object_id] = {ye_olde_object_id}; {enter}
    GO {enter}

    Nó sẽ không thực thi câu lệnh cho đến khi bạn đặt vào GO {enter}.

Hãy thận trọng khi trực tiếp chỉnh sửa bảng danh mục hệ thống và đừng quá thoải mái với ý tưởng thực hiện nó. Đây là cái gì đó nên được thực hiện chỉ nếu có hoàn toàn không có cách nào khác để sửa chữa một vấn đề (như trường hợp ở đây). Có thể có một số lý do để tránh thực hiện chỉnh sửa trực tiếp, nhưng hai lý do ban đầu xuất hiện là:

  • Giống như các mô hình dữ liệu mà chúng ta tạo ra, có thể có các quy tắc và quy trình công việc về cách mọi thứ hoạt động mà chúng ta không biết (ví dụ: không chuẩn hóa, quy tắc "kinh doanh" chi phối trạng thái dữ liệu trên các bảng khác nhau, v.v.)
  • Rất có thể thực hiện chỉnh sửa trực tiếp trách nhiệm của Microsoft để hỗ trợ bạn nếu bạn gặp sự cố và có hợp đồng hỗ trợ (Tôi chưa thấy các điều khoản của (các) thỏa thuận Hỗ trợ, nhưng tôi rất khó tin rằng ngôn ngữ đó sẽ không có trong đó ở đó)

    @Paul Randal đã xác nhận trong một nhận xét về câu trả lời liên quan của tôi: "chỉnh sửa thủ công bảng hệ thống không thể đặt cờ trong trang khởi động của cơ sở dữ liệu đánh dấu cơ sở dữ liệu của bạn đã được chỉnh sửa theo cách này và CSS có thể quyết định không giúp đỡ nếu bạn sau đó có vấn đề với cơ sở dữ liệu đó. "


4
Tôi thích câu trả lời, nhưng có lẽ đáng để thêm một câu là tại sao điều này rất nguy hiểm để làm?
Joe Obbish

@JoeObbish Cảm ơn, và đề nghị tốt. Tôi sẽ cố gắng để thêm một cái gì đó vào ngày mai.
Solomon Rutzky

2
@JoeObbish Tôi vừa thêm một cái gì đó. Như vậy đã đủ chưa?
Solomon Rutzky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.