Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Пользователю "sa" не удалось войти в систему


Автор: Secret 18.10.2007, 22:53
Сразу же хотел бы сказать то в Базах данных я пока что новичок, с вытекающими с этого последствиями, поэтому прошу не судить строго если что то не совсем правильно скажу. Приму все замечания и пожелания  smile 

И так, ближе к сабжу:

Код

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Customers]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Customers
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Inventory]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Inventory
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetPetName]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[GetPetName]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Orders]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Customers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Customers]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Inventory]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Inventory]
GO

CREATE DATABASE [Cars]  ON (NAME = N'Cars_Data', FILENAME =N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Cars_Data.MDF' , 
SIZE = 2, FILEGROWTH = 10%) 

LOG ON (NAME = N'Cars_Log', FILENAME= N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Cars_Log.LDF' , 
SIZE = 1, FILEGROWTH = 10%)
GO
use[Cars]
CREATE TABLE [dbo].[Customers] (
    [FirstName] [char] (20) NULL ,
    [LastName] [char] (20) NULL ,
    [CustID] [int] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Inventory] (
    [CarID] [int] NOT NULL ,
    [Make] [char] (20) NULL ,
    [Color] [char] (20) NULL ,
    [PetName] [char] (20) NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Orders] (
    [OrderID] [int] NOT NULL ,
    [CarID] [int] NULL ,
    [CustID] [int] NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Customers] WITH NOCHECK ADD 
    CONSTRAINT [PK_Customers] PRIMARY KEY  CLUSTERED 
    (
        [CustID]
    )  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[Inventory] WITH NOCHECK ADD 
    CONSTRAINT [PK_Inventory] PRIMARY KEY  CLUSTERED 
    (
        [CarID]
    )  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD 
    CONSTRAINT [PK_Orders] PRIMARY KEY  CLUSTERED 
    (
        [OrderID]
    )  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[Orders] ADD 
    CONSTRAINT [FK_Orders_Customers] FOREIGN KEY 
    (
        [CustID]
    ) REFERENCES [dbo].[Customers] (
        [CustID]
    ),
    CONSTRAINT [FK_Orders_Inventory] FOREIGN KEY 
    (
        [CarID]
    ) REFERENCES [dbo].[Inventory] (
        [CarID]
    )
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO


CREATE PROCEDURE GetPetName
@carID int,
@petName char(20) output

AS

SELECT @petName = PetName from Inventory where CarID = @carID


GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
use[Cars]
INSERT INTO Inventory (carID, Make, Color, PetName)
VALUES (0, 'BMW', 'Red', 'Chucky')
GO

INSERT INTO Inventory (carID, Make, Color, PetName)
VALUES (1, 'BMW', 'Green', 'Snake')
GO

INSERT INTO Inventory (carID, Make, Color, PetName)
VALUES (2, 'Viper', 'Red', 'Zippy')
GO

INSERT INTO Inventory (carID, Make, Color, PetName)
VALUES (3, 'BMW', 'Pink', 'Buddha')
GO

INSERT INTO Inventory (carID, Make, Color, PetName)
VALUES (4, 'Colt', 'Rust', 'Rusty')
GO

INSERT INTO Customers (custID, FirstName, LastName)
VALUES (0, 'Mike', 'Larson')
GO

INSERT INTO Customers (custID, FirstName, LastName)
VALUES (1, 'Amy', 'Smith')
GO

INSERT INTO Customers (custID, FirstName, LastName)
VALUES (2, 'Kandi', 'Nash')
GO

INSERT INTO Orders (orderID, custID, carID)
VALUES (0, 0, 0)
GO

INSERT INTO Orders (orderID, custID, carID)
VALUES (1, 1, 4)
GO



С помощью этого скрипта в SQL Server Management Studio создал новую базу Cars. Правда при создании базы бала обнаружена ошибка:
Код

Сообщение 1803, уровень 16, состояние 1, строка 2
Ошибка операции CREATE DATABASE. Размер первичного ключа должен быть как минимум 3 МБ, чтобы вместить копию базы данных model.
Сообщение 911, уровень 16, состояние 1, строка 1
Не удалось найти запись в таблице sysdatabases для базы данных "Cars". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.
Сообщение 4902, уровень 16, состояние 1, строка 2
Не удалось найти объект "dbo.Customers", так как он не существует, или отсутствуют разрешения.
Сообщение 1767, уровень 16, состояние 0, строка 2
Внешний ключ "FK_Orders_Customers" ссылается на недопустимую таблицу "dbo.Customers".
Сообщение 1750, уровень 16, состояние 0, строка 2
Нельзя создать ограничение. См. предыдущие ошибки.
Сообщение 911, уровень 16, состояние 1, строка 1
Не удалось найти запись в таблице sysdatabases для базы данных "Cars". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)
Сообщение 208, уровень 16, состояние 1, строка 2
Недопустимое имя объекта "Customers".
Сообщение 208, уровень 16, состояние 1, строка 2
Недопустимое имя объекта "Customers".
Сообщение 208, уровень 16, состояние 1, строка 2
Недопустимое имя объекта "Customers".

(строк обработано: 1)

(строк обработано: 1)


но подправив значение параметра с size=2 на size=3 в следующей строке того же скрипта

Код

CREATE DATABASE [Cars]  ON (NAME = N'Cars_Data', FILENAME =N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Cars_Data.MDF' , 
SIZE = 3, FILEGROWTH = 10%) 


база создалась на ура.

Дали с помощью VS2005 открыл готовый проект-пример. Когда запустил его то получил такую исключительную ситуацию

Код

***** Fun with Data Readers *****


Необработанное исключение: System.Data.SqlClient.SqlException: Пользователю "sa"
 не удалось войти в систему. Пользователь не связан с доверенным соединением с SQL Server.

 . . .


Что было сделано не так? 


Автор: SpaceSpace 19.10.2007, 08:47
Перво-наперво.
Включай Manegement Studio,
Коннектись к серверу.
Открывай папочку Security.
Выбирай пользователя sa.
Правой кнопкой - Properties. 
Там в списке выбирай status,
и где Permissions to connect to database engine
- выбирай GRANT
smile
это для начала

Автор: Secret 19.10.2007, 10:30
SpaceSpace, сделал так как ты писал, но пока что тот же exception...

Код

***** Fun with Data Readers *****
Необработанное исключение: System.Data.SqlClient.SqlException: Пользователю "sa"
 не удалось войти в систему. Пользователь не связан с доверенным соединением с SQL Server.
 . . .

Автор: HAL707 19.10.2007, 16:38
Строку подключения к БД можешь привести?

Автор: Secret 19.10.2007, 20:49
HAL707, буш сменяться, но твоя просьба оказалась как бы указанием мне на то что бы посмотреть внимательней на строку подключения.

В исходнике - файл прикреплённый к первому посту, строка подключения была не совсем полна.

  Когда я добавил новый источник данных в программу, то автоматически создаётся конфигурационный файл, который содержит правильную строку подключения. Все что остаться сделать в программе, это программными средствами, используя индексатор ConfigurationManager прочитать ConnectionString.
  Но можно и самому создать строку подключения с помощью экземпляра класа SqlConnectionStringBuilder. В моей ситуации  было сделано как раз так.

Не полная строка подключения:
Код

         // Create a connection string via the builder object.
            SqlConnectionStringBuilder cnStrBuilder =
                new SqlConnectionStringBuilder();
            cnStrBuilder.UserID = "sa";
            cnStrBuilder.Password = "";
            cnStrBuilder.InitialCatalog = "Cars";
            cnStrBuilder.DataSource = "(local)";
            cnStrBuilder.ConnectTimeout = 5;



Строка подключения, которая позволит безошибочно подключиться к базе:
Код

// Create a connection string via the builder object.
            SqlConnectionStringBuilder cnStrBuilder =
                new SqlConnectionStringBuilder();
            cnStrBuilder.UserID = "sa";
            cnStrBuilder.Password = "";
            cnStrBuilder.InitialCatalog = "Cars";
            cnStrBuilder.DataSource = "(local)";
            cnStrBuilder.ConnectTimeout = 5;
            
            cnStrBuilder.IntegratedSecurity = true;


И дело в шляпе, точнее говоря, в последней строчке последнего исходника smile)

Свойство cnStrBuilder.IntegratedSecurity - Вот что по этому поводу пишет справка:
Код

 Gets or sets a Boolean value that indicates whether User ID and Password are specified in the connection (when false) or whether the current Windows account credentials are used for authentication (when true). 


Просто в моем случае нужно было использовать учётную запись Виндовс для подключения к базе, а отсюда  и последняя строчка последнего исходника.

P.S. SpaceSpace и HAL707 - огромнейшее спасибо Вам за предоставленную помощь!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)