Как мне проверить эти столбцы? - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю с базой данных, и мне нужно проверить некоторые столбцы в схеме платежей.

Например, если кредитная карта не используется для платежей, CreditCardNumber, CardHoldersName и CreditCardExpDate должны иметь значение NULL.Если используется кредитная карта, значение CreditCardExpDate должно быть больше, чем PaymentDate PaymentDue может разрешить NULL, но не должно быть больше, чем PaymentAmount

Я искал в Интернете, но получаю сложные триггеры и процедуры, которые недействительно полезно.

  create table Payment.Payments(
  Payment_ID int identity (200, 21),
  Payment_Amount money constraint chk_Payment_Amount check (Payment_Amount > 
  '0'),
  Payment_Date date, -- is to be greater than the end date which is on another table
  Credit_Card_Number int,
  Card_Holders_Name char (50),
  Credit_Card_Expiry_Date date, 
  Project_ID int Foreign Key references ProjectDetails.Projects(Project_ID),
  Payment_Due money -- should not be greater than Payment Amount but 
  can still accept null*
   );

В примечаниях показана текущая проблема с проверкой, которая у меня есть.

Я создал триггер для payment_date, но я могу его активировать только тогда, когда вставлена ​​датабольше текущей даты, мне нужно его запустить, если она меньше конечной даты (конечная дата находится в другой таблице)

CREATE TRIGGER paymentdate ON Payment.Payments FOR INSERT AS DECLARE @ModifiedDate date SELECT @ModifiedDate= Payment_Date FROM Inserted IF (@ModifiedDate> getdate ()) BEGIN PRINT 'Дата изменения должна быть текущей датой.Следовательно, не может вставить.КОНЕЦ ТРАНЗАКЦИИ ROLLBACK

1 Ответ

0 голосов
/ 09 февраля 2019

Я читаю много между строк здесь, но я думаю это то, что вы ищете (заметьте, я использовал схему dbo хотя):

USE Sandbox;
GO

CREATE TABLE dbo.Payments (
    Payment_ID int identity(200, 21),
    Payment_Amount money CONSTRAINT chk_Payment_Amount CHECK (Payment_Amount > '0'),
    Payment_Date date,
    Credit_Card_Number char(19), --note datatype change from int to char. See my comment below (copied from my comment)
    Card_Holders_Name varchar (50), --note I've used varchar instead. Names aren't all 50 characters long
    Credit_Card_Expiry_Date date,
    --Project_ID int FOREIGN KEY REFERENCES ProjectDetails.Projects(Project_ID) --Commented out as I don't have this table
    Payment_Due money CONSTRAINT chk_Payment_Due CHECK (Payment_Due > '0' OR Payment_Due IS NULL)
    );
GO

--Credit Card format validation
ALTER TABLE dbo.Payments ADD CONSTRAINT ck_Credit_Card CHECK (Credit_Card_Number LIKE '[0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]' OR Credit_Card_Number IS NULL);

--Add card details must be there, or none.
ALTER TABLE dbo.Payments ADD CONSTRAINT ck_Card_Details CHECK ((Credit_Card_Number IS NULL AND Card_Holders_Name IS NULL AND Credit_Card_Expiry_Date IS NULL)
                                                           OR  (Credit_Card_Number IS NOT NULL AND Card_Holders_Name IS NOT NULL AND Credit_Card_Expiry_Date IS NOT NULL))

GO
DROP TABLE dbo.Payments;

Комментарий сделан к типу номера карты:

Тип данных int для номера кредитной карты немного оксюморон.Максимальное значение для int составляет 2 147 483 647, а номер карты состоит из 4 наборов из 4 цифр (т. Е. 9999 9999 9999 9999).Даже как число, это намного выше, чем максимальное значение int.Я бы предложил использовать char(19) и ограничить формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...